2016-02-18 2 views
0

В настоящее время я работаю над динамическим gridview, который позволит пользователю добавлять или удалять строки для сохранения в качестве записей базы данных позже.DataTable в ViewState возвращает удаленные строки

Мой GridView разметки как таковой:

<asp:UpdatePanel ID="upAirporterSchedule" runat="server" ChildrenAsTriggers="true" UpdateMode="Conditional"> 
       <ContentTemplate> 
        <asp:GridView ID="gvAirporterSchedule" runat="server" ShowFooter="true" AutoGenerateColumns="false" CssClass="table table-striped table-bordered table-hover dataTable no-footer" OnRowDataBound="gvAirporterSchedule_RowDataBound" OnRowCommand="gvAirporterSchedule_RowCommand"> 
         <Columns> 
          <asp:TemplateField HeaderText="Location" ItemStyle-Width="25%"> 
           <ItemTemplate> 
            <asp:DropDownList ID="ddlScheduleLoc" runat="server" CssClass="form-control"></asp:DropDownList> 
           </ItemTemplate> 
          </asp:TemplateField> 
          <asp:TemplateField HeaderText="Start Date"> 
           <ItemTemplate> 
            <div class="input-group"> 
             <asp:TextBox ID="tbxAirporterStartDate" runat="server" CssClass="form-control date-picker" Text='<%# Eval("StartDateColumn") %>'></asp:TextBox> 

             <span class="input-group-addon"> 
              <i class="fa fa-calendar"></i> 
             </span> 
            </div> 
           </ItemTemplate> 
          </asp:TemplateField> 
          <asp:TemplateField HeaderText="End Date"> 
           <ItemTemplate> 
            <div class="input-group"> 
             <asp:TextBox ID="tbxAirporterEndDate" runat="server" CssClass="form-control date-picker" Text='<%# Eval("EndDateColumn") %>'></asp:TextBox> 

             <span class="input-group-addon"> 
              <i class="fa fa-calendar"></i> 
             </span> 
            </div> 
           </ItemTemplate> 
          </asp:TemplateField> 
          <asp:TemplateField HeaderText="Departure Time"> 
           <ItemTemplate> 
            <div class="input-group"> 
             <asp:TextBox ID="tbxAirporterDepTime" runat="server" CssClass="form-control time-picker" Text='<%# Eval("DeptTimeColumn") %>'></asp:TextBox> 

             <span class="input-group-addon"> 
              <i class="fa fa-clock-o"></i> 
             </span> 
            </div> 
           </ItemTemplate> 
          </asp:TemplateField> 
          <asp:TemplateField HeaderText="Duration"> 
           <ItemTemplate> 
            <asp:TextBox ID="tbxAirporterDuration" runat="server" CssClass="form-control" Text='<%# Eval("DurationColumn") %>'></asp:TextBox> 
           </ItemTemplate> 
          </asp:TemplateField> 
          <asp:TemplateField HeaderText="Delete"> 
           <ItemTemplate> 
            <asp:Button ID="btnDel" runat="server" CssClass="btn btn-default" Text="Delete" CommandName="DeleteRow" /> 
           </ItemTemplate> 

           <FooterStyle HorizontalAlign="Right" /> 
           <FooterTemplate> 
            <asp:Button ID="btnAdd" runat="server" CssClass="btn btn-default" Text="Add Entry" CommandName="AddRow" /> 
           </FooterTemplate> 
          </asp:TemplateField> 
         </Columns> 
        </asp:GridView> 
       </ContentTemplate> 
      </asp:UpdatePanel> 

Помимо этой сетки, у меня есть некоторые другие поля в пользовательском элементе управления. Когда я перейду к сохранению, пользователь нажмет кнопку внизу пользовательского элемента управления, который будет упаковывать поля формы над ним и сетку в некоторые классы и снимать их с кода базы данных, чтобы добавить/обновить эти данные.

Page.Validate("AirporterFares"); 

     if (Page.IsValid) 
     { 
      try 
      { 
       // Save trip information. 
       SysVarService.SharedRideTrip trip = new SysVarService.SharedRideTrip(); 

       if (_tripID > 0) 
        trip = Global.sysVarService.GetSharedRideTripByID(_tripID); 

       trip.isVisible = 1; 
       trip.productType = ReservationService.ProductType.TOUR; 
       trip.originStopID = Convert.ToInt32(ddlOrigin.SelectedValue.ToString()); 
       trip.destinationStopID = Convert.ToInt32(ddlDestination.SelectedValue.ToString()); 
       trip.defaultDuration = 0; 
       trip.effectiveDate = DateTime.Parse(tbxAirporterEffDate.Text.Trim()); 
       trip.startTimeOfDay = new DateTime(trip.effectiveDate.Year, trip.effectiveDate.Month, trip.effectiveDate.Day, 1, 1, 1); 
       trip.endTimeOfDay = new DateTime(trip.effectiveDate.Year, trip.effectiveDate.Month, trip.effectiveDate.Day, 1, 1, 1); 

       // Save the two fare information. 
       SysVarService.SharedRideTrip_ShuttleFare aFare = new SysVarService.SharedRideTrip_ShuttleFare() 
       { 
        effectiveDate = trip.effectiveDate, 
        effectiveTravelDate = trip.effectiveDate, 
        paxTypeID = 1, 
        oneWayCost = Foundation.StringFormatter.currencyToDouble(tbxAirporterAdultFare.Text.Trim()), 
        returnCost = 0.00, 
        numPax = 1, 
        Currency = 0 
       }; 

       SysVarService.SharedRideTrip_ShuttleFare cFare = new SysVarService.SharedRideTrip_ShuttleFare() 
       { 
        effectiveDate = trip.effectiveDate, 
        effectiveTravelDate = trip.effectiveDate, 
        paxTypeID = 2, 
        oneWayCost = Foundation.StringFormatter.currencyToDouble(tbxAirporterChildFare.Text.Trim()), 
        returnCost = 0.00, 
        numPax = 1, 
        Currency = 0 
       }; 

       string status = ""; 

       if (_updating) 
        status = Global.sysVarService.UpdateAirporterFare(trip, aFare, cFare, GetScheduleEntries()); 
       else 
        status = Global.sysVarService.AddAirporterFare(trip, aFare, cFare, GetScheduleEntries()); 

       if (!String.IsNullOrEmpty(status)) 
       { 
        spanErrorMsg.Visible = true; 
        spanErrorMsg.InnerText = status; 
        return; 
       } 
      } 
      catch (Exception ex) 
      { 
       spanErrorMsg.Visible = true; 
       spanErrorMsg.InnerText = ex.ToString(); 
       return; 
      } 

      Response.Redirect("~/Internal/Admin/Default.aspx?action=Airporter_Fares"); 
     } 

Когда я иду либо добавить или обновить, я называю GetScheduledEntries, который должен петлей через DataTable (хватая его из ViewState) и преобразовывать шаблонные поля в свойство объекта и набивать эти объекты в списке ,

private List<AdminConfigService.SharedRideTimes> GetScheduleEntries() 
{ 
    int idx = 0; 

    List<AdminConfigService.SharedRideTimes> schedule = new List<AdminConfigService.SharedRideTimes>(); 

    if (gvAirporterSchedule.Rows.Count >= 1) 
    { 
     for (int i = 1; i <= gvAirporterSchedule.Rows.Count; ++i) 
     { 
      // Get data controls. 
      DropDownList ddl = (DropDownList)gvAirporterSchedule.Rows[idx].Cells[0].FindControl("ddlScheduleLoc"); 

      TextBox startDate = (TextBox)gvAirporterSchedule.Rows[idx].Cells[1].FindControl("tbxAirporterStartDate"); 
      TextBox endDate = (TextBox)gvAirporterSchedule.Rows[idx].Cells[2].FindControl("tbxAirporterEndDate"); 
      TextBox deptTime = (TextBox)gvAirporterSchedule.Rows[idx].Cells[3].FindControl("tbxAirporterDepTime"); 
      TextBox duration = (TextBox)gvAirporterSchedule.Rows[idx].Cells[4].FindControl("tbxAirporterDuration"); 

      schedule.Add(new AdminConfigService.SharedRideTimes() 
      { 
       StartDate = DateTime.Parse(startDate.Text.Trim()), 
       EndDate = DateTime.Parse(endDate.Text.Trim()), 
       DepartureTime = DateTime.Parse(deptTime.Text.Trim()), 
       Duration = Convert.ToInt32(duration.Text.Trim()), 
       EffectiveDates = "", 
       StopID = Convert.ToInt32(ddl.SelectedValue.ToString()) 
      }); 

      idx++; 
     } 

     return schedule; 
    } 
    else 
     return schedule; 
} 

Проблема заключается в том, если я удалить строки из этой точки зрения сетки, а затем пытаются сохранить форму, DataTable из ViewState будет вернуть эти удаленные строки и действовать, как они еще существуют для сохранения, несмотря на то, gridview и datatable больше не имеют этой строки (когда команда DeleteRow проходит).

else if (e.CommandName == "DeleteRow") 
    { 
     SetRowData(); 

     if (ViewState["AirporterScheduleTable"] != null) 
     { 
      DataTable dt = (DataTable)ViewState["AirporterScheduleTable"]; 
      DataRow currentRow = null; 

      GridViewRow gvr = (GridViewRow)(((Button)e.CommandSource).NamingContainer); 
      int idx = gvr.RowIndex; 

      if (dt.Rows.Count > 1) 
      { 
       dt.Rows.Remove(dt.Rows[idx]); 
       currentRow = dt.NewRow(); 

       ViewState["AirporterScheduleTable"] = dt; 

       gvAirporterSchedule.DataSource = dt; 
       gvAirporterSchedule.DataBind(); 

       SetPreviousData(); 
      } 
     } 
    } 

private void SetPreviousData() 
{ 
    int idx = 0; 

    if (ViewState["AirporterScheduleTable"] != null) 
    { 
     DataTable dt = (DataTable)ViewState["AirporterScheduleTable"]; 
     if (dt.Rows.Count > 0) 
     { 
      for (int i = 0; i < dt.Rows.Count; ++i) 
      { 
       // Get data controls. 
       DropDownList ddl = (DropDownList)gvAirporterSchedule.Rows[idx].Cells[0].FindControl("ddlScheduleLoc"); 

       TextBox startDate = (TextBox)gvAirporterSchedule.Rows[idx].Cells[1].FindControl("tbxAirporterStartDate"); 
       TextBox endDate = (TextBox)gvAirporterSchedule.Rows[idx].Cells[2].FindControl("tbxAirporterEndDate"); 
       TextBox deptTime = (TextBox)gvAirporterSchedule.Rows[idx].Cells[3].FindControl("tbxAirporterDepTime"); 
       TextBox duration = (TextBox)gvAirporterSchedule.Rows[idx].Cells[4].FindControl("tbxAirporterDuration"); 

       ddl.SelectedValue = dt.Rows[i]["LocColumn"].ToString(); 
       startDate.Text = dt.Rows[i]["StartDateColumn"].ToString(); 
       endDate.Text = dt.Rows[i]["EndDateColumn"].ToString(); 
       deptTime.Text = dt.Rows[i]["DeptTimeColumn"].ToString(); 
       duration.Text = dt.Rows[i]["DurationColumn"].ToString(); 

       idx++; 
      } 
     } 
    } 
} 

private void SetRowData() 
{ 
    int idx = 0; 

    if (ViewState["AirporterScheduleTable"] != null) 
    { 
     DataTable current = (DataTable)ViewState["AirporterScheduleTable"]; 
     DataRow currentRow = null; 

     if (current.Rows.Count > 0) 
     { 
      for (int i = 1; i <= current.Rows.Count; ++i) 
      { 
       // Get data controls. 
       DropDownList ddl = (DropDownList)gvAirporterSchedule.Rows[idx].Cells[0].FindControl("ddlScheduleLoc"); 

       TextBox startDate = (TextBox)gvAirporterSchedule.Rows[idx].Cells[1].FindControl("tbxAirporterStartDate"); 
       TextBox endDate = (TextBox)gvAirporterSchedule.Rows[idx].Cells[2].FindControl("tbxAirporterEndDate"); 
       TextBox deptTime = (TextBox)gvAirporterSchedule.Rows[idx].Cells[3].FindControl("tbxAirporterDepTime"); 
       TextBox duration = (TextBox)gvAirporterSchedule.Rows[idx].Cells[4].FindControl("tbxAirporterDuration"); 

       currentRow = current.NewRow(); 

       current.Rows[i - 1]["LocColumn"] = ddl.SelectedValue; 
       current.Rows[i - 1]["StartDateColumn"] = startDate.Text; 
       current.Rows[i - 1]["EndDateColumn"] = endDate.Text; 
       current.Rows[i - 1]["DeptTimeColumn"] = deptTime.Text; 
       current.Rows[i - 1]["DurationColumn"] = duration.Text; 

       idx++; 
      } 

      ViewState["AirporterScheduleTable"] = current; 
     } 
    } 
} 

Там, кажется, не быть где-либо в коде, который я не обновляя ViewState DataTable, когда я удалить или добавить записи в этой динамической GridView. Что может вызвать разницу в ViewStates? Имеет ли полная обратная передача кнопки вне UpdatePanel и GridView другую ViewState?

Я также в значительной степени следовал this tutorial точно.

ответ

0

Оказалось, что это один из тех случаев, когда вы пропускаете что-то простое. Когда я наполнение сетки с данными о нагрузке, я не защищал его с

if (!Page.IsPostback) 

Из-за того, что каждый раз, когда строка была удалена, она будет пополнить таблицу данных с данными о загрузке страницы и причинах странные проблемы, в которых удаленные строки, похоже, не удаляются.

Смежные вопросы