C# Gridview事件未触发

C# Gridview事件未触发,c#,asp.net,gridview,C#,Asp.net,Gridview,我有一个要求,如果网格视图中的任何值发生更改,我必须更新文本框。。我有一个2行的网格视图 一个是带标签的模板字段,另一个是带文本框的模板字段 我的网格视图看起来像 name value a (empty textbox) b (empty textbox)

我有一个要求,如果网格视图中的任何值发生更改,我必须更新文本框。。我有一个2行的网格视图

一个是带标签的模板字段,另一个是带文本框的模板字段

我的网格视图看起来像

                   name                 value
                   a                     (empty textbox)
                   b                     (empty textbox)
                   c                      (empty textbox)
现在,当用户在文本框中输入一个值时,它应该自动更新链接到此文本框的另一个文本框

我的问题是,当有人在文本框中输入一个值时,应该触发一个事件

(我正在从数据库中获取名称a、b、c)。我不想有一个编辑链接或更新链接,因为所有要输入的值都是强制性的

我尝试了Grid_SelectedIndexChanged1,但没有触发。。是否有什么我遗漏了或我需要改变,以便埃万特被解雇,我可以更新其他文本框

我是ASP.NET新手,请帮助我


提前谢谢

如果应该在文本更改时触发更新,则应使用
TextBox
OnTextChanged
事件,并将
AutoPostBack
设置为true

编辑

为了避免重复工作,使用上述方法,您可以使用Pankaj Garg在其回答中概述的技术找到行索引:

int rowIndex = ((GridViewRow)((TextBox)sender).NamingContainer).RowIndex;
这种方法最大的警告是它不能原谅标记中的更改。如果要将
文本框
包装在另一个实现了
INamingContainer
的控件中,上述示例将中断。例如:

<asp:TemplateField>
    <asp:Panel ID="Panel1" runat="server"> <!-- becomes the naming container -->
        <asp:TextBox ID="TextBox1" runat="server" onchange='valueChanged(<%# Container.ItemIndex %>);' />
    </asp:Panel>
</asp:TemplateField>
在代码隐藏中,重写
RaisePostBackEvent
方法,并将更新逻辑放在那里:

protected override void RaisePostBackEvent(IPostBackEventHandler source, string eventArgument)
{
    base.RaisePostBackEvent(source, eventArgument);

    if (source == GridView1)
    {
        int rowIndex = int.Parse(eventArgument);

        TextBox txt = GridView1.Rows[rowIndex].FindControl("TextBox1") as TextBox;
        if (txt != null)
        {
            var id = (int)GridView1.DataKeys[rowIndex]["ID"];
            var text = txt.Text.Trim();

            //update the database
        } 
    }    
}

如果应该在文本更改时触发更新,则应使用
TextBox
OnTextChanged
事件,并将
AutoPostBack
设置为true

编辑

为了避免重复工作,使用上述方法,您可以使用Pankaj Garg在其回答中概述的技术找到行索引:

int rowIndex = ((GridViewRow)((TextBox)sender).NamingContainer).RowIndex;
这种方法最大的警告是它不能原谅标记中的更改。如果要将
文本框
包装在另一个实现了
INamingContainer
的控件中,上述示例将中断。例如:

<asp:TemplateField>
    <asp:Panel ID="Panel1" runat="server"> <!-- becomes the naming container -->
        <asp:TextBox ID="TextBox1" runat="server" onchange='valueChanged(<%# Container.ItemIndex %>);' />
    </asp:Panel>
</asp:TemplateField>
在代码隐藏中,重写
RaisePostBackEvent
方法,并将更新逻辑放在那里:

protected override void RaisePostBackEvent(IPostBackEventHandler source, string eventArgument)
{
    base.RaisePostBackEvent(source, eventArgument);

    if (source == GridView1)
    {
        int rowIndex = int.Parse(eventArgument);

        TextBox txt = GridView1.Rows[rowIndex].FindControl("TextBox1") as TextBox;
        if (txt != null)
        {
            var id = (int)GridView1.DataKeys[rowIndex]["ID"];
            var text = txt.Text.Trim();

            //update the database
        } 
    }    
}

您可以检查当前行索引,如下所示

((GridViewRow)((TextBox)sender).NamingContainer).RowIndex
OnTextChanged
事件创建处理程序,并将
AutoPostBack属性设置为True

protected void TextBox_TextChanged(object sender, EventArgs e)
{
     int CurrentGridIndex = ((GridViewRow)((TextBox)sender).NamingContainer).RowIndex
}

您可以检查当前行索引,如下所示

((GridViewRow)((TextBox)sender).NamingContainer).RowIndex
OnTextChanged
事件创建处理程序,并将
AutoPostBack属性设置为True

protected void TextBox_TextChanged(object sender, EventArgs e)
{
     int CurrentGridIndex = ((GridViewRow)((TextBox)sender).NamingContainer).RowIndex
}


TextBox有一个AutoPostback属性,将其设置为true并处理TextChanged事件,或者使用javascript在客户端执行。请告诉我链接TextBox是什么意思?我也尝试过。。但是如何知道textbox更改了哪些行?@persian dev我还有其他textbox需要更新从这些字段中获取的值。。我有一个文本要用这些文本框字段提供的值进行编辑!selectedindexchanged在所选行的索引更改时激发,此实例中未发生此更改。如果您所做的只是用相同的文本更新另一个UI元素,那么对服务器进行访问就太过了。javascript,更具体地说,jquery将是一个更好的解决方案。TextBox有一个AutoPostback属性,将其设置为true并处理TextChanged事件,或者使用javascript在客户端执行。请告诉我链接TextBox是什么意思?我也试过了。。但是如何知道textbox更改了哪些行?@persian dev我还有其他textbox需要更新从这些字段中获取的值。。我有一个文本要用这些文本框字段提供的值进行编辑!selectedindexchanged在所选行的索引更改时激发,此实例中未发生此更改。如果您所做的只是用相同的文本更新另一个UI元素,那么对服务器进行访问就太过了。javascript,更具体地说,jquery将是一个更好的解决方案。如果GridView位于UpdatePanel中(只是猜测),他还需要为GridView的RowCommand添加一个触发器。@感谢您的回复,问题是我已经知道了文本框的哪个值。。例如,我必须知道..a的值=输入的值!我不知道你的意思。你是说你需要知道
TextBox
对应的是哪一行吗?嗨@James-如果你要将TextBox包装在另一个实现INamingContainer的控件中,上面的例子就会中断。你能不能把它弄得更精确些。抱歉,没有收到这句话。如果出于某种原因,他将
文本框
放在
面板
或另一个实现
INamingContainer
的控件中,代码将中断。如果GridView位于UpdatePanel中(只是猜测),他还需要为GridView的RowCommand添加一个触发器。@感谢您的回复,问题是我知道我现在拥有的文本框的哪个值。。例如,我必须知道..a的值=输入的值!我不知道你的意思。你是说你需要知道
TextBox
对应的是哪一行吗?嗨@James-如果你要将TextBox包装在另一个实现INamingContainer的控件中,上面的例子就会中断。你能不能把它弄得更精确些。抱歉,没有收到这句话。如果出于某种原因,他将
文本框
放在
面板
或另一个在MingContainer中实现
的控件中,代码将中断。@pankaj。。。我试着这样做,当我这样做,并试图访问细胞返回一个空字符串!我做了一些事情,比如GridViewRow gv=Grid.Rows[CurrentGridIndex];字符串值=gv.Cells[0]。文本;您可以在单元格中找到控件,如
(ControlType)gv.FindControl(“YourID”)
@pankaj。。。我