0

My ASP.NET page shows a partially databound gridview:

<asp:GridView ID="myGridView" runat="server" AutoGenerateColumns="False">
  <Columns>
    <asp:BoundField DataField="name" HeaderText="Name" />
    <asp:TemplateField HeaderText="Datum" ItemStyle-CssClass="tdRight">
      <ItemTemplate>
        <asp:TextBox ID="datum" runat="server" Text=""></asp:TextBox>
      </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Uhrzeit" ItemStyle-CssClass="tdRight">
      <ItemTemplate>
        <asp:TextBox ID="uhrzeit" runat="server" Text=""></asp:TextBox>
      </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Ort" ItemStyle-CssClass="tdRight">
      <ItemTemplate>
        <asp:TextBox ID="ort" runat="server" Text=""></asp:TextBox>
      </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Hausnummer" ItemStyle-CssClass="tdRight">
      <ItemTemplate>
        <asp:TextBox ID="hausnummer" runat="server" Text=""></asp:TextBox>
      </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Gebäude" ItemStyle-CssClass="tdRight">
      <ItemTemplate>
        <asp:TextBox ID="gebaeude" runat="server" Text=""></asp:TextBox>
      </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Raumnummer" ItemStyle-CssClass="tdRight">
      <ItemTemplate>
        <asp:TextBox ID="raumnummer" runat="server" Text=""></asp:TextBox>
      </ItemTemplate>
    </asp:TemplateField>
  </Columns>
</asp:GridView>

The TextBoxes are to be filled with User-Input and then added as columns to a DataTable:

DataTable inputData = new DataTable();
inputData.Columns.Add(new DataColumn("datum", typeof(String)));
inputData.Columns.Add(new DataColumn("uhrzeit", typeof(String)));
inputData.Columns.Add(new DataColumn("ort", typeof(String)));
inputData.Columns.Add(new DataColumn("hausnummer", typeof(String)));
inputData.Columns.Add(new DataColumn("gebaeude", typeof(String)));
inputData.Columns.Add(new DataColumn("raumnummer", typeof(String)));
foreach(DataRow row in myGridView.Rows) {
  foreach(DataColumn col in row.ItemArray) {
    DataRow dr = inputData.NewRow();
    dr["datum"] = ((TextBox) myGridView.FindControl("datum")).Text;
    dr["uhrzeit"] = ((TextBox) myGridView.FindControl("uhrzeit")).Text;
    dr["ort"] = ((TextBox) myGridView.FindControl("ort")).Text;
    dr["hausnummer"] = ((TextBox) myGridView.FindControl("hausnummer")).Text;
    dr["gebaeude"] = ((TextBox) myGridView.FindControl("gebaeude")).Text;
    dr["raumnummer"] = ((TextBox) myGridView.FindControl("raumnummer")).Text;
    inputData.Rows.Add(dr);
    printRow(dr);
  }
}

How can I access the textareas, getting the text from each and appending the input data to the DataTable used to create each row?

Jongware
  • 22,200
  • 8
  • 54
  • 100

1 Answers1

2

You can loop all rows in the grid and then use row.FindControl to get the TextBoxes. The GridViewRow is the NamingContainer of the controls not the GridView:

foreach (GridViewRow row in myGridView.Rows)
{
    DataRow newRow = inputData.Rows.Add();
    newRow.SetField("datum", ((TextBox)row.FindControl("datum")).Text);
    // and so on...
    // note that you don't need to add the row since it's already added
}
Tim Schmelter
  • 450,073
  • 74
  • 686
  • 939
  • Nice, except for the part with the .SetField not working here. I had to use newRow["datum"] = ((TextBox)row.FindControl("datum")).Text); instead. – AspiringChampionOfCode Sep 24 '14 at 07:26
  • @StehAufmSchlauch: you either use < .NET 3.5 or you haven't added a reference to `System.Data.DataSetExtensions` dll. I prefer `SetField` or `Field` extension methods since they work strongly typed which increases readability and makes the code more robust. They also support nullable types. – Tim Schmelter Sep 24 '14 at 08:14
  • it's a .NET 2.0 Project. Thanks for the advice with the DataSetExtensions methods. – AspiringChampionOfCode Sep 24 '14 at 15:09