Estos son muy desordenados.
Aquí hay una solución muy simple y elegante. Supongamos que su cuadrícula necesita mostrar datos en una tabla con 3 columnas. Los datos proviene de un objeto con la siguiente estructura:
[Serializable]
public class Foo
{
public string Bar1 { get; set; }
public string Bar2 { get; set; }
public string Bar3 { get; set; }
}
A continuación, el control de usuario tendrán el siguiente marcado:
de marcado (GridDisplayRow.ascx):
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="GridDisplayRow.ascx.cs" Inherits="GridDisplayRow" %>
<div>
<div class="cell">
<asp:TextBox id="TxtProperty1" runat="server"/>
</div>
<div class="cell">
<asp:DropDownList ID="DDLProperty2" runat="server" OnSelectedIndexChanged="DDLProperty2_OnSelectedIndexChanged" AutoPostBack="true">
</asp:DropDownList>
</div>
<div class="cell">
<input type="radio" id="RadProperty3" runat="server">
</div>
</div>
Aviso toda la etiquetas div Los div hijos se flotan ... para que se muestren uno al lado del otro.
Codebehind (GridDisplayRow.ascx.cs):
class GridDisplayRow:UserControl
{
public event EventHandler<System.EventArgs> SomethingHappened;
protected void Page_Load(object sender, EventArgs e)
{
//Initialize the drop down with something;
}
//this is where we handle internal events generated by children controls.
//Eg: the drop down's index changed.
protected void DDLProperty2_OnSelectedIndexChanged(object sender, EventArgs e)
{
//we update some other child control in this...
this.TxtProperty1.Text = this.DDLProperty2.Value;
//and maybe we want to signal the page that some event happened
if(SomethingHappened != null)
{
//Notify the page that SomethingHappened event occured
SomethingHappened(this, EventArgs.Empty);
}
}
//This is where the binding happens
public object BindingObject
{
set
{
Foo temp = (Foo)value;
this.TxtProperty1.Text = temp.Bar1;
this.DDLProperty2.Value = temp.Bar2;
this.RadProperty3.Value = temp.Bar3;
this.ViewState["Foo"] = temp;
}
}
}
Así que en el código anterior estamos manejando la unión a Foo, en otras palabras, estamos mostrando propiedades de Foo en cada celda (div) del control .El molde es necesario porque la propiedad anterior es de tipo objeto, y en la plantilla de elemento de la cuadrícula/repetidor/lo que tienes, vincularás una instancia de GridDisplayRow al objeto Container.DataItem como se muestra a continuación. Hemos de tener en cuenta que si el origen de datos es un conjunto de datos, por ejemplo, usted tiene que echar a DataRow, o si se necesita cualquier tipo de datos adecuado:
Página de marcado:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Test.aspx.cs" Inherits="Test" %>
<%@ Register src="GridDisplayRow.ascx" tagname="GridRow" tagprefix="ctrl" %>
<asp:GridView ID="GridView1" runat="server">
<Columns>
<asp:TemplateField>
<HeaderTemplate>
<div>
<div class="header cell">Header 1</div>
<div class="header cell">Header 2</div>
<div class="header cell">Header 3</div>
</div>
</HeaderTemplate>
<ItemTemplate>
<ctrl:GridRow ID="Row" runat="server" BindingObject='<%# Container.DataItem %>' OnSomethingHappened="Row_SomethingHappened" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
no me gusta trabajar con rejillas porque son desordenadas y engorrosas. En este caso, engañamos a la cuadrícula para crear una tabla con una sola celda por fila y nos ocupamos del diseño dentro de esa celda mediante hojas de estilo.
Tenga en cuenta que esto funciona mejor con un repetidor ya que es muy eficiente y tiene menos carga.
Ahora vinculando la grilla: Cualquier fuente que implemente IEnumerable se puede usar para enlazar a la grilla. Como tal, una colección como List será suficiente.
Cuando el control GridRow dispara sus eventos, se envía una referencia al control a través del remitente del objeto, por lo tanto, si emite el remitente al tipo correcto puede tomar las propiedades internas del control ... las posibilidades son infinitas.
La ventaja de este método es la abstracción. Cada control puede manejar sus propios eventos, o elige notificar a la página de eventos que ocurrieron dentro de él .... bla bla bla. Entiendes la idea.