Почему событие GridView Rowupdating не захватывает новые значения текстового поля? - PullRequest
3 голосов
/ 11 июля 2011

Я использую gridview.Когда я нажимаю кнопку редактирования, появляется кнопка обновления и отмены.После изменения значений в текстовом поле, которые приходят из EditItemTemplate, новые значения не отображаются в обработчике событий rowupdating (), вместо этого я получаю значения, которые появляются при визуализации страницы.Как мне получить новые значения из этих текстовых полей и продолжить?Вот код.

<asp:GridView ID="GridView1" runat="server" AutoGenerateEditButton="true" AutoGenerateColumns="false" 
        AutoGenerateDeleteButton="true" onrowediting="GridView1_RowEditing" 
        onrowupdating="GridView1_RowUpdating">
    <Columns>


    <asp:TemplateField>
    <ItemTemplate>
        <asp:Label ID="lblId" runat="server" Text='<%# Eval("id") %>'></asp:Label>
    </ItemTemplate>
    <EditItemTemplate>
        <asp:TextBox ID="txtId" runat="server" Text='<%# Eval("id") %>'></asp:TextBox>
    </EditItemTemplate>
    </asp:TemplateField>

    <asp:TemplateField>
    <ItemTemplate>
        <asp:Label ID="lblName" runat="server" Text='<%# Eval("cpuname") %>'></asp:Label>
    </ItemTemplate>
    <EditItemTemplate>
        <asp:TextBox ID="txtName" runat="server" Text='<%# Eval("cpuname") %>'></asp:TextBox>
    </EditItemTemplate>
    </asp:TemplateField>

    <asp:TemplateField>
    <ItemTemplate>
        <asp:Label ID="lblStatus" runat="server" Text='<%# Eval("status") %>'></asp:Label>
    </ItemTemplate>
    <EditItemTemplate> 
      <asp:TextBox ID="txtStatus" runat="server" Text='<%# Eval("status") %>'></asp:TextBox>
     </EditItemTemplate>
    </asp:TemplateField>

    </Columns>


</asp:GridView>


protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
        {
            GridView1.EditIndex = e.NewEditIndex;
        }

        protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            TextBox text = (TextBox)GridView1.Rows[e.RowIndex].FindControl("txtName");
        }

Ответы [ 5 ]

5 голосов
/ 11 июля 2011

Вы должны использовать двустороннюю привязку здесь. То есть Привязка вместо Eval:

<asp:TextBox ID="txtId" runat="server" Text='<%# Bind("id") %>'></asp:TextBox>

Вот ссылка на документацию:

Обзор выражений привязки данных

Вот мой код:

protected void Page_Load(object sender, EventArgs e)
    {
        DataTable table = new DataTable();
        table.Columns.Add("Data");
        for(int i = 0; i < 20; i++)
            table.Rows.Add(new object[] { i });
        GridView1.DataSource = table;
    if(!IsPostBack)  // <<<<<<<<<<<<
        GridView1.DataBind();
    }
protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
    {
        GridView1.EditIndex = e.NewEditIndex;
        GridView1.DataBind();
    }       

    protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        TextBox text = (TextBox)GridView1.Rows[e.RowIndex].FindControl("txtId");
    }
1 голос
/ 26 мая 2012

Если вы написали код для привязки сетки при загрузке страницы, убедитесь, что он заключен в if(!IsPostBack) Я надеюсь, что это поможет

0 голосов
/ 06 ноября 2014

Я слежу за Платоном, и это работает!

Поставьте if(!IsPostBack) перед databind(), и вставьте GridView1.DataBind(); после GridView1.EditIndex = e.NewEditIndex; в GridView1_RowEditing

0 голосов
/ 04 февраля 2014

Это сработало для меня.

protected void MyGridView_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    string value = e.NewValues[0].ToString();
    // ...
}
0 голосов
/ 11 июля 2011

Попробуйте это

TextBox text = (TextBox)GridView1.Rows[e.EditIndex].FindControl("txtName");

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...