2015-03-03 111 views
0

我想补充的textBox到dataTable的row.I不知道该怎么办that.Is有可能的textBox添加到DataTable首先,它给我这个错误:添加文本框

Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index

这里是我的代码:

标记:

<asp:GridView ID="GridView2" runat="server" ShowHeader="false" OnRowDataBound="GridView2_RowDataBound"> 
    <Columns> 
     <ItemTemplate > 
      <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 
     </ItemTemplate> 
    </asp:TemplateField>      
    </Columns> 
</asp:GridView> 

代码背后:

private void AddNewRecordRowToGrid() 
{ 
    DataTable dt = new DataTable(); 
    DataRow dr; 
    dt.TableName = "table"; 

    dt.Columns.Add(new DataColumn("Zabeleshka", typeof(TextBox))); 
    dr = dt.NewRow(); 
    dt.Rows.Add(dr); 

    ViewState["marks"] = dt; 

    if (ViewState["marks"] != null) 
    { 
     DataTable dtCurrentTable = (DataTable)ViewState["marks"]; 

     DataRow drCurrentRow = null; 

     if (dtCurrentTable.Rows.Count > 0) 
     { 
      for (int i = 1; i <= dtCurrentTable.Rows.Count; i++) 
      { 
       TextBox TextBox1 = (TextBox)GridView2.Rows[0].FindControl("TextBox1"); 

       drCurrentRow["Zabeleshka"] = TextBox1.Text; 

       if (dtCurrentTable.Rows[0][0].ToString() == "") 
       { 
        dtCurrentTable.Rows[0].Delete(); 

        dtCurrentTable.AcceptChanges(); 
       } 
       dtCurrentTable.Rows.Add(drCurrentRow); 
       ViewState["marks"] = dtCurrentTable; 

       GridView2.DataSource = dtCurrentTable; 
       GridView2.DataBind(); 

      } 
     } 
    } 
} 
+0

'Textbox'是控制和'Datatable'是在内存中的表持有数据,而不是控制,所以你需要存储在数据表中的值并绑定将具有相关文本框的gridview。 – 2015-03-03 09:32:24

+0

@RahulSingh现在我该怎么办? - 我该如何解决这个问题? – buba 2015-03-03 09:33:35

+0

@RahulSingh例子? – buba 2015-03-03 09:45:53

回答

0

当你的标记代码我想你想的文本框里面的GridView包含若干值成,

为此, 首先您的标记是不正确的,正确的是,

<asp:GridView ID="GridView2" runat="server" ShowHeader="false" OnRowDataBound="GridView2_RowDataBound"> 
    <Columns> 
    <asp:TemplateField> <%-- you have not opened it in your markup --%> 
     <ItemTemplate > 
      <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 
     </ItemTemplate> 
    </asp:TemplateField>      
    </Columns> 
</asp:GridView> 

并在后面的代码, 得到文本框的值,你需要

TextBox TextBox1 = (TextBox)GridView2.Rows[0].FindControl("TextBox1"); 

编辑,

在你的代码,

for (int i = 1; i <= dtCurrentTable.Rows.Count; i++) 
      { 
       TextBox TextBox1 = (TextBox)GridView2.Rows[0].FindControl("TextBox1"); 

       drCurrentRow["Zabeleshka"] = TextBox1.Text; 

for循环的条件是(我< = dtCurrentTable.Rows.Count)
你应该试试这个(我< dtCurrentTable.Rows.Count) 因为行的计数是从0开始,这就是为什么你索引超出范围错误。

+0

我修复了templateField,但它一直给我这个错误:索引超出范围。必须是非负数且小于集合的大小。参数名称:索引 – buba 2015-03-03 10:21:39

+0

假定您的数据表的行数是8,但是如果您想访问最后一行,那么行地址将是行[7]。看到我的回答 – Ejaz47 2015-03-03 11:07:06

+0

现在行不添加 – buba 2015-03-03 12:43:00

0

你可以添加一个文本框到一个gridview没有问题,然后从RowDataBound网格方法中的代码中找到它。您的问题很可能是因为您关闭了您的TemplateField并且尚未打开一个。您需要添加

<asp:TemplateField> 

你上面的

<ItemTemplate>.