2014-01-14 74 views
1

我有一個gridview,用戶可以用複選框選擇項目。在頁面的底部,我有一個保存按鈕,我想遍歷gridview行並傳遞選定的行LinkID。當我去迭代雖然,我的gridview.rows返回0,但有行在那裏......我做錯了什麼?由於遍歷按鈕上的gridview行點擊

<asp:UpdatePanel ID="upPanResults" runat="server"> 
     <ContentTemplate> 
      <div id="divResults" style="min-height: 350px;"> 
       <asp:GridView ID="grdInvoice" ClientIDMode="Static" runat="server" CssClass="DG" 
        Width="100%" DataKeyNames="LinkID" AutoGenerateColumns="False" GridLines="Vertical" 
        CellPadding="4" AllowPaging="True" AllowCustomPaging="True" PageSize="1000" PagerStyle-Visible="False" 
        ShowFooter="true" RowStyle-CssClass="Item" AlternatingRowStyle-CssClass="Alternating" 
        HeaderStyle-CssClass="HomeDGhead" SelectedRowStyle-CssClass="Selected" 
        OnRowDataBound="grdInvoice_RowDataBound"> 
        <Columns> 
         <asp:TemplateField HeaderText="Address"> 
          <ItemTemplate> 
           <asp:Label ID="Address" CssClass="norm" runat="server"><%# DataBinder.Eval(Container, "DataItem.Address") %></asp:Label> 
          </ItemTemplate> 
         </asp:TemplateField> 
         <asp:TemplateField HeaderText="Date"> 
          <ItemTemplate> 
           <asp:Label ID="Date" CssClass="norm" runat="server"><%# DataBinder.Eval(Container, "DataItem.Date") %></asp:Label> 
          </ItemTemplate> 
         </asp:TemplateField> 
         <asp:TemplateField HeaderText="Total"> 
          <ItemTemplate> 
           <asp:Label runat="server" ID="LblAmount" CssClass="no_border" Text='<%# DataBinder.Eval(Container, "DataItem.Amount") %>'></asp:Label> 
          </ItemTemplate> 
         </asp:TemplateField> 
         <asp:TemplateField> 
          <ItemTemplate> 
           <asp:CheckBox ID="ChkSelect" runat="server" /> 
          </ItemTemplate> 
         </asp:TemplateField> 
        </Columns> 
       </asp:GridView> 
      </div> 
      <table width="98%"> 
       <tr height="25"> 
        <td align="left"> 
         <asp:Label ID="Label1" runat="server" CssClass="head2" Text="Approval Number:" ClientIDMode="Static"></asp:Label>&nbsp;&nbsp;<asp:TextBox 
          ID="Txt" runat="server" CssClass="norm" ClientIDMode="Static"></asp:TextBox> 
        </td> 
        <td align="right"> 
         <asp:Label ID="Label3" runat="server" CssClass="head2" Text="Selected Total:"></asp:Label> 
         &nbsp;&nbsp; 
         <asp:Label ID="LblTotal" runat="server" ClientIDMode="Static" CssClass="head2" Text="0"></asp:Label> 
        </td> 
       </tr> 
       <tr height="25"> 
        <td align="center" colspan="2"> 
         <asp:Button ID="BtnSave" runat="server" CssClass="btn" 
          Text="Save" OnClick="BtnSave_Click" /> 
         &nbsp;&nbsp;<asp:Button ID="btnCancel" runat="server" CssClass="btn" Text="Cancel" 
          OnClick="btnCancel_Click" /> 
        </td> 
       </tr> 
      </table> 
     </ContentTemplate> 
    </asp:UpdatePanel> 



protected void BtnSave_Click(object sender, EventArgs e) 
     { 
      upProgress.Visible = false; 
      string sLinks = ""; 
      int iLinks = 0; 
      CheckBox chk; 
      foreach (GridViewRow row in grdInvoice.Rows) 
      { 
       chk = (CheckBox)row.Cells[3].Controls[1]; 
       if (chk.Checked == true) 
       { 
        sLinks += grdInvoice.DataKeys[row.RowIndex].Value.ToString() + ","; 
        iLinks = iLinks + 1; 
       } 

      } 
} 
+0

你可以發佈代碼綁定你的網格嗎? – Kelsey

+0

protected void BindData(int iClient) { DataContext dc = new DataContext(ConfigurationManager.ConnectionStrings [「DB」]。ConnectionString); var qry = from dc.usp_list_client_invoice_details(iClient)中的c select c; grdInvoice.DataSource = qry.ToList(); grdInvoice.DataBind(); } – user1801525

+0

是否在頁面或網格的父控件中禁用了'ViewState'? – Kelsey

回答

1

您可以通過以下內容,你被選中的CheckBox的通過行迭代:

foreach (GridViewRow row in yourGrid.Rows) 
{ 
    CheckBox chk = row.Cells[3].Controls[1] as CheckBox; 
    if ((chk != null) && chk.Checked) 
    { 
     int yourID = Convert.ToInt32(yourGrid.DataKeys[row.RowIndex].Value); 
     // Do something with each row here... 
    } 
} 

你確定你不是之前重新綁定在回發電網爲空DataSource您保存按鈕火災?檢查您的PageLoad事件。

我看到你有多個UpdatePanel控件。嘗試在UpdatePanel中設置Trigger,其中包含GridView以鏈接到帶有保存按鈕的UpdatePanelClick。服務器端不知道綁定到GridView的數據或GridView數據未被髮回到服務器的情況正在發生。

0

謝謝,不,我沒有重印回發。我注意到,如果我清除了保存按鈕中的所有內容,則網格是空白的。我在同一屏幕上的搜索面板中綁定網格。

<asp:UpdatePanel ID="upInvoice" runat="server"> 
     <ContentTemplate> 
      <div id="divSearch" style="background-color: #e6f3e7; border: 1px solid #333; min-height: 50px;"> 
       <asp:Panel ID="pnlSearch" runat="server" DefaultButton="BtnGo"> 
        <br /> 
        <asp:Label ID="lblClient" runat="server" Text="Client:" CssClass="head2" ClientIDMode="Static"></asp:Label>&nbsp;&nbsp; 
        <asp:DropDownList ID="ddlClient" runat="server" Width="200px" CssClass="norm" ClientIDMode="Static" 
         AutoPostBack="true" OnSelectedIndexChanged="ddlClient_SelectedIndexChanged"> 
        </asp:DropDownList> 
        &nbsp;&nbsp;<asp:Label ID="Label4" runat="server" Text="Area:" ClientIDMode="Static" 
         CssClass="head2" Visible="false"></asp:Label>&nbsp;&nbsp; 
        <asp:DropDownList ID="ddlArea" runat="server" Width="200px" ClientIDMode="Static" 
         CssClass="norm" Visible="false"> 
        </asp:DropDownList> 
        <asp:Button ID="btnGo" runat="server" 
           CssClass="btn" Text="Go" OnClick="btnGo_Click" /> 
        </br> </br> 
       </asp:Panel> 
      </div> 
     </ContentTemplate> 
    </asp:UpdatePanel> 

protected void Page_Load(object sender, EventArgs e) 
     { 
      if (!Page.IsPostBack) 
      { 

       BindInvoicingClients(); 

       ddlArea.Items.Add(new ListItem("[ALL]", "0")); 
       ddlArea.SelectedValue = "0"; 

      } 
     } 
     protected void ddlClient_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      if (int.Parse(ddlClient.SelectedValue) == 1) 
      { 
       PopulatePropertyAreaDropdown(int.Parse(ddlClient.SelectedValue)); 

      } 
     } 

protected void btnGo_Click(object sender, EventArgs e) 
     { 

      grdInvoice.DataSource = null; 
      grdInvoice.DataBind(); 

      BindGrid(int.Parse(ddlClient.SelectedValue)); 

     }