2014-06-10 54 views
0

问题和说明仍然被刷新:的GridView不用时的UpdatePanel

我与编程RowDataBound添加DropDownLists到每一个细胞一个GridView。

DropDownLists都有Data Sources

当我按下“保存”按钮时,它意味着读取DropDownLists中的所有selecteditems并将它们保存到数据库中。

但是,当我点击按钮时,它会导致postback并删除GridView中的所有控件,因此,在我的button_click事件中都不能找到它们。

之前提出问题之前,尝试不同的技术来尝试将下拉列表存储在缓存/会话状态等,我似乎无法保留下拉列表或数据,当我点击按钮。

因此,我现在试图添加UpdatePanel并使用AJAX尝试停止GridView的刷新。

我的尝试是这样:

      <asp:GridView ID="gv_Rota" runat="server" AutoGenerateColumns="false" OnRowDataBound="gv_Rota_RowDataBound"> 
            <HeaderStyle BackColor="#6a3d98" ForeColor="White" Height="20" /> 
            <RowStyle HorizontalAlign="Center" Height="20px" Width="100px" /> 
            <AlternatingRowStyle Height="20px" /> 
           </asp:GridView> 
          </div> 

          <asp:Label ID="lbl_NameOfRota" runat="server" Text="New rota name:"></asp:Label> 
          <input runat="server" id="txt_RotaName" /> 

          <asp:UpdatePanel runat="server" ID="RotaUpdatePanel"> 
           <ContentTemplate> 
          <asp:Button ID="btn_AddRota" runat="server" Text="Add" OnClick="btn_AddRota_Click" CssClass="ButtonAdminPage" /> 
            </ContentTemplate> 
          </asp:UpdatePanel> 

正如你可以看到,我放置在UpdatePanel在我的按钮而已,但是,它似乎仍然刷新GridView和删除所有控件。

问题:

第一,为什么我尝试不工作?

其次,我怎样才能解决这个问题,使用AJAX和更新面板,还是有另一种方法让我需要我? (记住,如果有其他建议,我可能已经尝试过了)。

编辑2:

提供的代码:

这是当我绑定DropDownLists:

protected void gv_Rota_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     for (int i = 1; i <= ColumnCount; i++) 
     { 
      if (e.Row.RowType == DataControlRowType.DataRow) 
      { 
       int day = e.Row.RowIndex; 
       day += 1; 
       ddlShift = new DropDownList(); 
       ddlShift.ID = "ddlShift" + "WK" + i.ToString() + "DAY" + day.ToString(); 
       ddlShift.DataSource = DCListOfShifts; 
       ddlShift.DataValueField = "SHIFT_ID"; 
       ddlShift.DataTextField = "SHIFT_NAME"; 
       ddlShift.Attributes.Add("Place", i.ToString()); 
       ddlShift.DataBind(); 
       ddlShift.Items.Insert(0, new ListItem("Shift...")); 
       ddlShift.CssClass = "ddl_rotamanager"; 
       e.Row.Cells[i].Controls.Add(ddlShift); 
      } 
     }   
    } 

这是当创建在GridView依赖于列的量通过:

private void BindGrid(int Amount) 
    { 
      gv_Rota.DataSource = null; 
      gv_Rota.Columns.Clear(); 

     BoundField bfield = new BoundField(); 
     bfield.HeaderText = "Days"; 
     bfield.DataField = "Days"; 
     gv_Rota.Columns.Add(bfield); 

     for (int i = 0; i < Amount; i++) 
     { 
      int week = i + 1; 
      string sWeek = "Week " + week.ToString(); 

      TemplateField tfield = new TemplateField(); 
      tfield.HeaderText = sWeek; 
      gv_Rota.Columns.Add(tfield); 
     } 

     DataTable dt = new DataTable(); 
     dt.Columns.Add(new DataColumn("Days", typeof(string))); 
     dt.Rows.Add("M"); 
     dt.Rows.Add("T"); 
     dt.Rows.Add("W"); 
     dt.Rows.Add("T"); 
     dt.Rows.Add("F"); 
     dt.Rows.Add("S"); 
     dt.Rows.Add("S"); 
     gv_Rota.DataSource = dt; 
     gv_Rota.DataBind(); 

    } 

这是我得到的列选择量,并调用方法来创建GridView的,我也量存储在缓存:

protected void ddl_RotaAmountOfWeeks_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (IsPostBack) 
     { 
      int Amount; 
      int.TryParse(ddl_RotaAmountOfWeeks.SelectedItem.ToString(), out Amount); 

      ColumnCount = Amount; 

      Cache.Add("columnCount", ColumnCount, null, Cache.NoAbsoluteExpiration, new TimeSpan(0, 60, 0), CacheItemPriority.Default, null); 

      BindGrid(Amount); 
     } 
    } 

按钮代码:

protected void btn_AddRota_Click(object sender, EventArgs e) 
    { 
     //My first attempt at trying to save the GridView, realising I Cache'd the GridView before selecting items. 
     //gv_Rota = (GridView)Cache["cacheGridView"]; 

     //Set of the size of the array to the amount of rows * colums 
     //this will be the maximum amount of events added 
     int arraysize = gv_Rota.Rows.Count * (int)Cache["columnCount"]; 

     //the current array item being added 
     int arrayitem = 0; 

     //Finally an array of ROTA_EVENTS to pass to WCF 
     wsPersonnel.DC_WFM_ROTA_EVENTS[] arrayofRotaEvents = new wsPersonnel.DC_WFM_ROTA_EVENTS[arraysize]; 


     foreach (GridViewRow row in gv_Rota.Rows) 
     { 
      for (int i = 1; i <= (int)Cache["columnCount"]; i++) 
      { 
       int day = row.RowIndex; 
       day += 1; 
       DropDownList DDL1 = (DropDownList)gv_Rota.Rows[row.RowIndex].Cells[i].FindControl("ddlShiftWK" + i.ToString() + "DAY" + day.ToString()); 

       wsPersonnel.DC_WFM_ROTA_EVENTS dcEvent = new wsPersonnel.DC_WFM_ROTA_EVENTS 
       { 
        SHIFT_ID = DDL1.SelectedItem.Value, 
        WEEK = i, 
        WEEKSpecified = true, 
        DAY = day, 
        DAYSpecified = true, 
       }; 
       arrayofRotaEvents[arrayitem++] = dcEvent; 
      } 
     } 

     wsP.AddRota(new wsPersonnel.DC_WFM_ROTA 
     { 
      ROTA_NAME = txt_RotaName.Value, 
      PERIOD_TYPE = 1, 
      PERIOD_TYPESpecified = true, 
      PERIOD_AMOUNT = ColumnCount, 
      PERIOD_AMOUNTSpecified = true, 
      ROTA_EVENTS = arrayofRotaEvents 
     }); 
    } 

什么样的实例GridView控件的样子:

enter image description here

+0

回答你的问题,是不是的UpdatePanel(恕我直言,没有答案是使用的UpdatePanel)我猜这是因为你动态地添加控件,然后当你回发控制不再存在,因为你没有反弹它们。你需要提供你的代码中,多了很多,如在这里你绑定你的GridView和方法的RowDataBound等 –

+0

@matt_lethargic是正确的,你需要添加我提供了我的C#代码CS –

+0

页@matt_lethargic的更多的代码。编辑的问题。欣赏答复。 – EliotE123

回答

0

如果你想停止里面T按钮点击回传他更新面板,那么你可以试试这个

<asp:UpdatePanel runat="server" ID="RotaUpdatePanel" UpdateMode="Conditional"> 
    <ContentTemplate> 
    <asp:Button ID="btn_AddRota" runat="server" Text="Add" OnClick="btn_AddRota_Click" CssClass="ButtonAdminPage" ClientIDMode="AutoID"/> 
    </ContentTemplate> 
    <Triggers> 
    <asp:AsyncPostBackTrigger ControlID="btn_AddRota" EventName="Click" /> 
    </Triggers> 
</asp:UpdatePanel> 
+0

谢谢我已经尝试添加您回复的代码位,但是,正如我怀疑的那样,GridView控件仍在被擦除,这意味着GridView必须重置或刷新仍然。可能是因为从服务器传递到客户端和回来等.. – EliotE123

+0

请分享您的'btn_AddRota_Click' C#代码 –

+0

代码为您提供。 – EliotE123

相关问题