簡體   English   中英

如何在新的Select(ASP.NET)上清除gridview

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM