Сохраняются данные полей шаблона вида сетки Asp.net

У меня есть вид сетки, который содержит 4 поля шаблона, каждое из которых содержит текстовое поле. Теперь я связал эти поля шаблона с источником данных. Когда я, как пользователь, ввожу некоторые данные в текстовое поле и нажимаю кнопку сохранения (кнопка, которая не является частью grid view, а является отдельной частью веб-формы), я не могу получить значения в обработчике события click в коде позади файла. Пожалуйста, помогите мне.

файл aspx

  <asp:TemplateField HeaderText="col1"> 
    <ControlStyle Height="25px" Width="60px" />
      <ItemTemplate>
            <asp:TextBox ID="txt1" runat="server" Text='<%# Bind("[col1]") %>'>   
            </asp:TextBox>                 
      </ItemTemplate>
  </asp:TemplateField>
    
<asp:TemplateField HeaderText="col2">  
  <ControlStyle Height="25px" Width="60px" />
    <ItemTemplate>
      <asp:TextBox ID="txt2" runat="server"  Text='<%# Bind("[col2]") %>'>  
      </asp:TextBox>
    </ItemTemplate>
 </asp:TemplateField>
    
<asp:TemplateField HeaderText="col3"> 
  <ControlStyle Height="25px" Width="60px" />
    <ItemTemplate>
      <asp:TextBox ID="txt3" runat="server"  Text='<%# Bind("[col3]") %>'>
      </asp:TextBox>
    </ItemTemplate>
 </asp:TemplateField>
    
<asp:TemplateField HeaderText="col4"> 
  <ControlStyle Height="25px" Width="60px" />
    <ItemTemplate>
      <asp:TextBox ID="txt4" runat="server"  Text='<%# Bind("[col4]") %>'>
      </asp:TextBox>
    </ItemTemplate>       
</asp:TemplateField>

Код за файлом

protected void ButtonAdd_Click(object sender, EventArgs e)
{

    foreach (GridViewRow row in gvEdit.Rows)
    {



            string a = ((TextBox)row.FindControl("col1")).Text;
                 //above line gives a null value


    }
}

1 ответ

Решение

Вам нужно перебрать GridViewRowCollectionи затем для каждой строки найдите элемент управления Id Вы дали это в разметке. Например:

protected void ButtonAdd_Click(object sender, EventArgs e)
{
    foreach (GridViewRow row in gvEdit.Rows)
    {
        var txt1 = row.FindControl("txt1") as TextBox;
        var txt2 = row.FindControl("txt2") as TextBox;
        var txt3 = row.FindControl("txt3") as TextBox;
        var txt4 = row.FindControl("txt4") as TextBox;

        // access the Text property of each, e.g. txt1.Text
    }
}

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

protected void Page_Load(object sender, EventArgs e) 
{
    if (!IsPostBack)
    {
        GridView1.DataSource = // data source
        GridView1.DataBind();
    }
}
Другие вопросы по тегам