Lo más Las respuestas aquí no explican: ¿qué sucede si necesita hacer columnas visibles e invisibles, todas basadas en datos dinámicamente? Después de todo, ¿no debería estar GridViews
centrado en los datos?
¿Qué sucede si quiere activar o desactivar las columnas en función de sus datos?
Mi Gridview
<asp:GridView ID="gvLocationBoard" runat="server" AllowPaging="True" AllowSorting="True" ShowFooter="false" ShowHeader="true" Visible="true" AutoGenerateColumns="false" CellPadding="4" ForeColor="#333333" GridLines="None"
DataSourceID="sdsLocationBoard" OnDataBound="gvLocationBoard_DataBound" OnRowDataBound="gvLocationBoard_RowDataBound" PageSize="15" OnPreRender="gvLocationBoard_PreRender">
<RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
<Columns>
<asp:TemplateField HeaderText="StudentID" SortExpression="StudentID" Visible="False">
<ItemTemplate>
<asp:Label ID="Label2" runat="server" Text='<%# Eval("StudentID") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Student" SortExpression="StudentName">
<ItemTemplate>
<asp:Label ID="Label3" runat="server" Text='<%# Eval("StudentName") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Status" SortExpression="CheckStatusName" ItemStyle-HorizontalAlign="Center">
<ItemTemplate>
<asp:HiddenField ID="hfStatusID" runat="server" Value='<%# Eval("CheckStatusID") %>' />
<asp:Label ID="Label4" runat="server" Text='<%# Eval("CheckStatusName") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="RollCallPeriod0" Visible="False">
<ItemTemplate>
<asp:CheckBox ID="cbRollCallPeriod0" runat="server" />
<asp:HiddenField ID="hfRollCallPeriod0" runat="server" Value='<%# Eval("RollCallPeriod") %>' />
</ItemTemplate>
<HeaderStyle Font-Size="Small" />
<ItemStyle HorizontalAlign="Center" />
</asp:TemplateField>
<asp:TemplateField HeaderText="RollCallPeriod1" Visible="False">
<ItemTemplate>
<asp:CheckBox ID="cbRollCallPeriod1" runat="server" />
<asp:HiddenField ID="hfRollCallPeriod1" runat="server" Value='<%# Eval("RollCallPeriod") %>' />
</ItemTemplate>
<HeaderStyle Font-Size="Small" />
<ItemStyle HorizontalAlign="Center" />
</asp:TemplateField>
..
etc..
Nota del ` "RollCallPeriodn", donde 'n' es un número secuencial.
La forma en que lo hago, es por diseño ocultar todas las columnas que sé que van a estar ENCENDIDAS (visible = "verdadero") u OFF (visible = "falso") más tarde, y según mis datos .
En mi caso, quiero mostrar los Períodos del Periodo hasta cierta columna. Así, por ejemplo, si hoy es 09 a.m. a continuación, quiero mostrar períodos de 6 am, 7 am, 8 y las 9, pero no las 10, las 11, etc.
En otros días que quiero para mostrar todos los tiempos. Y así.
Entonces, ¿cómo hacemos esto?
¿Por qué no utilizar PreRender
para "restablecer" el Gridview
?
protected void gvLocationBoard_PreRender(object sender, EventArgs e)
{
GridView gv = (GridView)sender;
int wsPos = 3;
for (int wsCol = 0; wsCol < 19; wsCol++)
{
gv.Columns[wsCol + wsPos].HeaderText = "RollCallPeriod" + wsCol.ToString("{0,00}");
gv.Columns[wsCol + wsPos].Visible = false;
}
}
Ahora encender las columnas que necesita en función de encontrar el inicio de la HeaderText y crea la columna visible si el texto del encabezado no es el predeterminado.
protected void gvLocationBoard_DataBound(object sender, EventArgs e)
{
//Show the headers for the Period Times directly from sdsRollCallPeriods
DataSourceSelectArguments dss = new DataSourceSelectArguments();
DataView dv = sdsRollCallPeriods.Select(dss) as DataView;
DataTable dt = dv.ToTable() as DataTable;
if (dt != null)
{
int wsPos = 0;
int wsCol = 3; //start of PeriodTimes column in gvLocationBoard
foreach (DataRow dr in dt.Rows)
{
gvLocationBoard.Columns[wsCol + wsPos].HeaderText = dr.ItemArray[1].ToString();
gvLocationBoard.Columns[wsCol + wsPos].Visible = !gvLocationBoard.Columns[wsCol + wsPos].HeaderText.StartsWith("RollCallPeriod");
wsPos += 1;
}
}
}
No voy a revelar el SqlDataSource
aquí, pero basta con decir, con la PreRender
, puedo restablecer mi GridView
y encender las columnas que quiera con las cabeceras que quiero.
Así que la forma en que funciona es que cada vez que selecciona una fecha o períodos de tiempo diferentes para mostrar como encabezados, restablece el GridView al texto de encabezado predeterminado y Visible = "falso" antes de construir el gridview
nuevamente. De lo contrario, sin el PreRender
, el GridView tendrá los encabezados de los datos anteriores, ya que el código detrás borra la configuración predeterminada.
su unión GridView por datatable? por favor agregue su código aquí –
GridView1.DataSource = patientObj.GetAllPatients(). Tablas [0]; GridView1.DataBind(); –
while GetAllPatients() es un método que devuelve el objeto DataSet –