[英]How to clear gridview on new Select (ASP.NET)
我试图根据我选择的下拉值创建一个表,但是当我做出另一选择时,这些表不会清除自身,因此会在上一个表旁边得到一个新表。
ASP代码是这样的:
<div>
<div id="div_LH">
<div id="div_left">
<asp:Label Text="Fecha desde: " CssClass="cssLabels" runat="server" /><input type="text" id="datepickerFrom" runat="server"/>
</div>
<div id="div_right">
<asp:Label Text="Fecha hasta: " CssClass="cssLabels" runat="server" /><input type="text" id="datepickerTo" runat="server"/>
</div>
<br />
<div id="div_tipoHab">
<asp:Label Text="Tipo habitación: " CssClass="cssLabels" runat="server" /><asp:DropDownList ID="ddl_tipoHabitaciones" CssClass="cssLabels" runat="server" AutoPostBack="True" OnSelectedIndexChanged="ddl_tipoHabitaciones_SelectedIndexChanged"></asp:DropDownList>
</div>
</div>
<div id="hola" runat="server">
<asp:GridView CssClass="cssLabels" ID="grid_view_habitaciones" runat="server" BorderColor="#CCCCCC" BorderStyle="Double" GridLines="Horizontal">
</asp:GridView>
</div>
后面的代码:
Sistema sistema = Sistema.Instancia;
protected void ddl_tipoHabitaciones_SelectedIndexChanged(object sender, EventArgs e)
{
if (ddl_tipoHabitaciones.SelectedItem != null && datepickerFrom.Value != "" && datepickerTo.Value != "")
{
string[] fechaDesdeArray = datepickerFrom.Value.Split('/');
string[] fechaHastaArray = datepickerTo.Value.Split('/');
string diaDesdeTexto = fechaDesdeArray[0];
string diaHastaTexto = fechaHastaArray[0];
int diaDesde;
int diaHasta;
string mesDesdeTexto = fechaDesdeArray[1];
string mesHastaTexto = fechaHastaArray[1];
int mesDesde;
int mesHasta;
string anioDesdeTexto = fechaDesdeArray[2];
string anioHastaTexto = fechaHastaArray[2];
int anioDesde;
int anioHasta;
if (int.TryParse(diaDesdeTexto, out diaDesde) && int.TryParse(mesDesdeTexto, out mesDesde)
&& int.TryParse(anioDesdeTexto, out anioDesde) && int.TryParse(anioHastaTexto, out anioHasta)
&& int.TryParse(mesHastaTexto, out mesHasta) && int.TryParse(diaHastaTexto, out diaHasta))
{
DateTime fechaDesde = new DateTime(anioDesde, mesDesde, diaDesde);
DateTime fechaHasta = new DateTime(anioHasta, mesHasta, diaHasta);
List<Habitacion> habitaciones = sistema.ObtenerHabitacionesDisponiblesXTipo(fechaDesde, fechaHasta, ddl_tipoHabitaciones.SelectedItem.Value);
hola.Visible = true;
int cantidadPasajeros;
List<ArrayList> diccHabitaciones = sistema.obtenerHabitacionesIguales(habitaciones, out cantidadPasajeros);
grid_view_habitaciones.AutoGenerateColumns = false;
string nuHabit = "Numero de Habitaciones disponibles";
string tieneJac = "Jacuzzi";
string esExt = "Exterior";
string cantCamSimples = "Cantidad de camas Simples";
string cantCamDobles = "Cantidad de camas Dobles";
string precio = "Precio (U$S)";
DataTable table = new DataTable();
DataColumn columnNumHabit = new DataColumn(nuHabit, typeof(System.Int32));
table.Columns.Add(columnNumHabit);
DataColumn columnTieneJacuzzi = new DataColumn(tieneJac, typeof(System.Boolean));
table.Columns.Add(columnTieneJacuzzi);
DataColumn columnEsExterior = new DataColumn(esExt, typeof(System.Boolean));
table.Columns.Add(columnEsExterior);
DataColumn columnCantCamasSingles = new DataColumn(cantCamSimples, typeof(System.Int32));
table.Columns.Add(columnCantCamasSingles);
DataColumn columnCantCamasDobles = new DataColumn(cantCamDobles, typeof(System.Int32));
table.Columns.Add(columnCantCamasDobles);
DataColumn columnPrecio = new DataColumn(precio, typeof(System.Decimal));
table.Columns.Add(columnPrecio);
for (var i = 0; i < diccHabitaciones.Count ; i++)
{
DataRow row = table.NewRow();
row[nuHabit] = diccHabitaciones[i][0];
Habitacion habitacion = (Habitacion)diccHabitaciones[i][1];
row[tieneJac] = habitacion.TieneJacuzzi;
row[esExt] = habitacion.EsExterior;
row[cantCamSimples] = habitacion.CantCamasSingles;
row[cantCamDobles] = habitacion.CantCamasDobles;
row[precio] = habitacion.Precio.MontoDolares;
table.Rows.Add(row);
}
foreach (DataColumn dc in table.Columns)
{
if (dc.DataType != typeof(System.Boolean))
{
BoundField boundfield = new BoundField();
boundfield.DataField = dc.ColumnName;
boundfield.HeaderText = dc.ColumnName;
boundfield.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
boundfield.ControlStyle.Width = Unit.Pixel(40);
grid_view_habitaciones.Columns.Add(boundfield);
} else
{
CheckBoxField checkbox = new CheckBoxField();
checkbox.DataField = dc.ColumnName;
checkbox.HeaderText = dc.ColumnName;
checkbox.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
grid_view_habitaciones.Columns.Add(checkbox);
}
}
grid_view_habitaciones.DataSource = table;
grid_view_habitaciones.DataBind();
}
}
}
非常感谢。 我一直在寻找其他答案,但是所有人都在谈论使用dataGridView1.DataSource = null;
或dataGridView1.Rows.Clear();
而且我认为这不是问题所在,或者至少,我不知道在哪里添加。
您可能会环顾Page.IsPostBack 。 如果第一次请求该页面,则GridView会绑定到其DataSource并将数据呈现在网页上。 由于您的DropDownList的AutoPostBack属性设置为true,因此在您单击其他选择时将其回发到服务器
但是默认情况下,您的GridView启用了ViewState属性, 因此ASP .Net将强制实施一种机制,以使其在从服务器到客户端的往返过程中保留其数据,以便能够呈现事件,尽管HTTP通常是无状态的。 这是使其看起来是有状态的默认方式。 因此,您的新数据将添加到现有数据中,并且您会在前一个旁边看到一个新表。
因此,通常应该在代码的开头进行类似于此的测试
protected void ddl_tipoHabitaciones_SelectedIndexChanged(object sender, EventArgs e)
{
if (Page.IsPostBack()) {
// clear the GridView rows here
}
// continue with the processing code
.....
}
问题是因为每次调用该方法时,它都会创建另一组列。 为避免该问题,您可以将DataColumnCollection保存到Session变量中,然后检查该变量是否不为null。
if (Session["dataColumns"] == null)
{
foreach (DataColumn dc in table.Columns)
{
if (dc.DataType != typeof(System.Boolean))
{
BoundField boundfield = new BoundField();
boundfield.DataField = dc.ColumnName;
boundfield.HeaderText = dc.ColumnName;
boundfield.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
grid_view_habitaciones.Columns.Add(boundfield);
} else
{
CheckBoxField checkbox = new CheckBoxField();
checkbox.DataField = dc.ColumnName;
checkbox.HeaderText = dc.ColumnName;
checkbox.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
grid_view_habitaciones.Columns.Add(checkbox);
}
}
Session["dataColumns"] = table.Columns;
}
然后,您需要在离开页面之前清理Session变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.