2015-03-01 1 views
1

Я пытаюсь создать таблицу в зависимости от выпадающего значения, которое я выбираю, но когда я делаю другой выбор, таблицы не очищаются, и я получаю новый таблицу в результате предыдущей.Как очистить gridview на новом 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();, и я не думаю, что это проблема здесь или, по крайней мере, я не знаю, где ее добавить.

+0

DataBind сетка с другим источником. – mybirthname

ответ

0

Проблема в том, потому что каждый раз, когда вызывается метод, он создает другой набор столбцов. Чтобы избежать этой проблемы, вы можете сохранить DataColumnCollection в переменной Session, а затем проверить, не является ли эта переменная нулевой.

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; 
    } 

Затем вам нужно очистить переменную сеанса перед выходом из страницы.

+0

Я забыл сказать вам, что вам нужно очистить переменную Session в методе page_load(), когда это не вызов обратной передачи. – Francisco

0

Вы можете посмотреть около Page.IsPostBack. Если страница запрашивается при первом подключении GridView к своему DataSource, а данные отображаются на веб-странице. Так как ваш DropDownList имеет свойство AutoPostBack, установленное в true, в тот момент, когда вы нажмете на него в другом отборе, это сообщение возвращает страницу на сервер.

Но по умолчанию у вашего GridView есть свойство ViewState, , поэтому ASP .Net будет внедрить механизм, который позволяет ему сохранять его данные между поездкой туда и обратно от сервера к клиенту, чтобы иметь возможность отображать это событие, хотя HTTP обычно не имеет состояния. Это способ по умолчанию, чтобы он выглядел statefull. Поэтому ваши новые данные будут добавлены к существующей, и вы увидите новую таблицу рядом с предыдущей.

Таким образом, вы обычно должны пройти тест в начале кода аналогично этому

protected void ddl_tipoHabitaciones_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    if (Page.IsPostBack()) { 
     // clear the GridView rows here 

    } 

    // continue with the processing code 
    ..... 
}