2013-08-28 2 views
0

У меня есть следующий код, который я нашел на этом уроке:Значение не добавляется в текстовое поле

http://geekswithblogs.net/dotNETvinz/archive/2009/06/04/adding-dynamic-rows-in-gridview-with-textboxes.aspx

Default.aspx

<asp:gridview ID="Gridview1" runat="server" ShowFooter="true" 
          AutoGenerateColumns="false"> 
     <Columns> 
     <asp:BoundField DataField="RowNumber" HeaderText="Row Number" /> 
     <asp:TemplateField HeaderText="Header 1"> 
      <ItemTemplate> 
       <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Header 2"> 
      <ItemTemplate> 
       <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Header 3"> 
      <ItemTemplate> 
       <asp:TextBox ID="TextBox3" runat="server"></asp:TextBox> 
      </ItemTemplate> 
      <FooterStyle HorizontalAlign="Right" /> 
      <FooterTemplate> 
       <asp:Button ID="ButtonAdd" runat="server" Text="Add New Row" onclick="ButtonAdd_Click" /> 
      </FooterTemplate> 
     </asp:TemplateField> 
     </Columns> 
</asp:gridview> 

Default.aspx.cs

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


private void SetInitialRow(){ 

     DataTable dt = new DataTable(); 
     DataRow dr = null; 
     dt.Columns.Add(new DataColumn("RowNumber", typeof(string))); 
     dt.Columns.Add(new DataColumn("Column1", typeof(string))); 
     dt.Columns.Add(new DataColumn("Column2", typeof(string))); 
     dt.Columns.Add(new DataColumn("Column3", typeof(string))); 

     dr = dt.NewRow(); 
     dr["RowNumber"] = 1; 
     dr["Column1"] = string.Empty; 
     dr["Column2"] = string.Empty; 
     dr["Column3"] = string.Empty; 
     dt.Rows.Add(dr); 

     //Store the DataTable in ViewState 
     ViewState["CurrentTable"] = dt; 

     Gridview1.DataSource = dt; 
     Gridview1.DataBind(); 
} 

private void AddNewRowToGrid(){ 

     int rowIndex =0; 
     if (ViewState["CurrentTable"] != null) 
     { 
      DataTable dtCurrentTable = (DataTable)ViewState["CurrentTable"]; 
      DataRow drCurrentRow = null; 
      if (dtCurrentTable.Rows.Count > 0) 
      { 
       for (int i = 1; i <= dtCurrentTable.Rows.Count; i++) 
       { 
        //extract the TextBox values 
        TextBox box1 = (TextBox)Gridview1.Rows[rowIndex].Cells[1].FindControl("TextBox1"); 
        TextBox box2 = (TextBox)Gridview1.Rows[rowIndex].Cells[2].FindControl("TextBox2"); 
        TextBox box3 = (TextBox)Gridview1.Rows[rowIndex].Cells[3].FindControl("TextBox3"); 

        drCurrentRow = dtCurrentTable.NewRow(); 
        drCurrentRow["RowNumber"] = i + 1; 
        drCurrentRow["Column1"] = box1.Text; 
        drCurrentRow["Column2"] = box2.Text; 
        drCurrentRow["Column3"] = box3.Text; 

        rowIndex++; 
       } 

       //add new row to DataTable 
       dtCurrentTable.Rows.Add(drCurrentRow); 
       //Store the current data to ViewState 
       ViewState["CurrentTable"] = dtCurrentTable; 

       //Rebind the Grid with the current data 
       Gridview1.DataSource = dtCurrentTable; 
       Gridview1.DataBind(); 
      } 
     } 
     else 
     { 
      Response.Write("ViewState is null"); 
     } 

     //Set Previous Data on Postbacks 
     SetPreviousData(); 
} 

private void SetPreviousData(){ 

     int rowIndex = 0; 
     if (ViewState["CurrentTable"] != null) 
     { 
      DataTable dt = (DataTable)ViewState["CurrentTable"]; 
      if (dt.Rows.Count > 0) 
      { 
       for (int i = 1; i < dt.Rows.Count; i++) 
       { 
        TextBox box1 = (TextBox)Gridview1.Rows[rowIndex].Cells[1].FindControl("TextBox1"); 
        TextBox box2 = (TextBox)Gridview1.Rows[rowIndex].Cells[2].FindControl("TextBox2"); 
        TextBox box3 = (TextBox)Gridview1.Rows[rowIndex].Cells[3].FindControl("TextBox3"); 


        box1.Text = dt.Rows[i]["Column1"].ToString(); 
        box2.Text = dt.Rows[i]["Column2"].ToString(); 
        box3.Text = dt.Rows[i]["Column3"].ToString(); 

        rowIndex++; 

       } 
      } 
     } 
} 

protected void ButtonAdd_Click(object sender, EventArgs e){ 
     AddNewRowToGrid(); 
} 

Теперь проблема заключается в том, чтобы сказать, когда появляется встроенная сетка, и я добавляю некоторые данные, а затем clic k добавить строку. Данные, добавленные мной в эту строку, остаются там. Но теперь, скажем, я добавил 5 строк, а затем я перехожу к строке номер 3, и я добавляю некоторые данные и нажимаю добавить строку, эти данные исчезают и никогда не появляются. Данные будут отображаться только в том случае, если я добавлю данные в последнюю строку, а затем нажмите добавить строку. Кто-нибудь знает, почему это происходит?

+0

Где находится 'ButtonAdd_Click'? Как вызывается вызов «AddNewRowToGrid»? –

+0

его на событие onclick для кнопки в нижнем колонтитуле –

+0

@ P.Brian.Mackey - в самом низу опубликованного кода. –

ответ

0

Это происходит из-за этот цикл:

for (int i = 1; i <= dtCurrentTable.Rows.Count; i++) 
{ 
    //extract the TextBox values 
    TextBox box1 = (TextBox)Gridview1.Rows[rowIndex].Cells[1].FindControl("TextBox1"); 
    TextBox box2 = (TextBox)Gridview1.Rows[rowIndex].Cells[2].FindControl("TextBox2"); 
    TextBox box3 = (TextBox)Gridview1.Rows[rowIndex].Cells[3].FindControl("TextBox3"); 

    drCurrentRow = dtCurrentTable.NewRow(); 
    drCurrentRow["RowNumber"] = i + 1; 
    drCurrentRow["Column1"] = box1.Text; 
    drCurrentRow["Column2"] = box2.Text; 
    drCurrentRow["Column3"] = box3.Text; 

    rowIndex++; 
} 

Он проходит через все строки в таблице данных и построение drCurrentRow объекта, но только добавление drCurrentRow объекта вне цикла:

//add new row to DataTable 
dtCurrentTable.Rows.Add(drCurrentRow); 

Поэтому содержимое drCurrentRow являются последней строки.

UPDATE:

Чтобы решить эту проблему, я рекомендую вам сделать это, только одна строка может быть добавлено время, а затем вместо того, чтобы цикл через все строки в таблице данных, просто получить данные из последней строки и использовать это как данные для «новой» строки для добавления в таблицу данных, например:

//extract the TextBox values 
TextBox box1 = (TextBox)Gridview1.Rows[dtCurrentTable.Rows.Count - 1].Cells[1].FindControl("TextBox1"); 
TextBox box2 = (TextBox)Gridview1.Rows[dtCurrentTable.Rows.Count - 1].Cells[2].FindControl("TextBox2"); 
TextBox box3 = (TextBox)Gridview1.Rows[dtCurrentTable.Rows.Count - 1].Cells[3].FindControl("TextBox3"); 

drCurrentRow = dtCurrentTable.NewRow(); 
drCurrentRow["RowNumber"] = dtCurrentTable.Rows.Count + 1; 
drCurrentRow["Column1"] = box1.Text; 
drCurrentRow["Column2"] = box2.Text; 
drCurrentRow["Column3"] = box3.Text; 

//add new row to DataTable 
dtCurrentTable.Rows.Add(drCurrentRow); 
+0

как я могу это исправить? –

+0

@BradHazelnut - я бы предложил сделать так, чтобы в сетку можно было добавить только одну строку за раз. И вместо того, чтобы перебирать все строки, просто используйте данные из последнего элемента таблицы данных, чтобы заполнить «новую» строку. См. 'UPDATE:' в моем ответе. –

+0

Я просто попробовал это и, похоже, дал тот же результат –

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