2016-02-03 37 views
0

我有一个我填充的GridView。它显示正确并显示数据。它包含一个复选框列,我的目的是当用户单击表单上的一个按钮时,它遍历GridView的行,并通过选中CheckBox合计用户选择的所有行。当我尝试遍历行时,填充的GridView为空

(我如何做到这一点从http://asp.net-informations.com/gridview/checkbox.htm细节)

,问题就出现在这一点上,我已经发现,它得到的线

foreach (GridViewRow row in grdItems.Rows) 

grdItems之前。即使GridView当前正在显示数据,Rows.Count = 0。

GridView控件:

<asp:GridView ID="grdItems" AutoGenerateColumns="false" runat="server" > 
    <Columns> 
     <asp:TemplateField> 
      <ItemTemplate> 
       <asp:CheckBox ID="chkCtrl" runat="server" /> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:BoundField DataField="Item_No" HeaderText="Item No" /> 
     <asp:BoundField DataField="Amount" HeaderText="Amount" /> 
    </Columns> 
</asp:GridView> 

的按钮:

<asp:Button ID="cmdOK" runat="server" Text="Add" /> 

的按钮的onClick:

protected void cmdOK_Click(object sender, EventArgs e) 
{ 
    if (ValidateForm()) 
    { 
     SaveP2P(); 
    } 
} 

的方法,该填充的GridView:

private void FillGrid() 
{ 
    System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection("Snipped for privacy"); 
    conn.Open(); 
    System.Data.OleDb.OleDbCommand cmd = new System.Data.OleDb.OleDbCommand(); 
    cmd.CommandText = "Snipped for privacy"; 
    cmd.Connection = conn; 
    System.Data.OleDb.OleDbDataAdapter adp = new System.Data.OleDb.OleDbDataAdapter(cmd); 
    System.Data.DataSet ds = new System.Data.DataSet(); 
    adp.Fill(ds); 
    adp.Dispose(); 
    cmd.Dispose(); 
    conn.Close(); 

    grdItems.DataSource = ds; 
    grdItems.DataBind(); 

} 

其中包含我与

private bool ValidateForm() 
{ 
    bool result = true; 
    decimal TotalAmount = 0; 
    //If I display a message here, it shows grdItems.Rows.Count is 0 
    foreach (GridViewRow row in grdItems.Rows) 
    { 
     if (row.RowType == DataControlRowType.DataRow) 
     { 
      CheckBox chkRow = (row.Cells[0].FindControl("chkCtrl") as CheckBox); 
      if (chkRow.Checked) 
      { 
       TotalAmount += Decimal.Parse(row.Cells[2].Text); 
      } 
     } 
    } 

    decimal amount; 
    if (decimal.TryParse(txtAmount.Text, out amount)) 
    { 
     if (amount > TotalAmount) 
     { 
      result = false; 
     } 
    } 
    else 
    { 
     result = false; 
    } 

    return result; 
} 
+0

是否在'if(IsPostBack)'中调用'FillGrid()'。另外,你在哪里调用'DataBind()'? – Balah

回答

0

这听起来像是在当页面回发到服务器时,它正在失去在网格中的所有数据的视图状态问题挣扎的代码ValidateForm()方法。你有没有尝试在你的页面上启用viewstate来查看gridview行是否被返回。

+0

你是对的 - 事实证明ViewState在GridView上设置为false ...嘿。谢谢!上面的代码是简化版本,我忽略了所有的CSS样式和东西,并且完全错过了所有这些属性......我从另一个GridView中复制了这些属性。 –

相关问题