网格视图事件未激发
本文关键字:事件 视图 网格 | 更新日期: 2023-09-27 18:29:37
我有一个要求,如果网格视图中的任何值发生更改,我必须更新文本框。。我有一张两排的格子图。。
一个是带有标签的模板字段,另一个是带文本框的模板字段。。。
我的网格视图看起来像
name value
a (empty textbox)
b (empty textbox)
c (empty textbox)
现在,当用户在文本框中输入一个值时,它应该自动更新链接到该值的另一个文本框。
我的问题是,当有人在文本框中输入值时,应该触发事件!
(我正在从数据库中获取名称a、b、c)。我不想有一个编辑链接或更新链接,因为所有要输入的值都是强制性的!
我尝试了Grid_SelectedIndexChanged1,但没有启动。。是我缺少了什么,还是我需要更改,以便启动evant,然后我可以更新另一个文本框??
我是ASP.NET的新手,请帮忙!
提前感谢!
如果更新应该在文本更改时触发,则应使用TextBox
的OnTextChanged
事件,并将AutoPostBack
设置为true。
编辑
为了避免重复工作,使用上述方法,您可以使用Pankaj Garg在他的回答中概述的技术来找到行索引:
int rowIndex = ((GridViewRow)((TextBox)sender).NamingContainer).RowIndex;
这种方法最大的警告是,它不能容忍标记中的更改。如果要将TextBox
封装在另一个实现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>
也就是说,您希望相应地标记标记,以便其他开发人员知道在进行更改时要小心。
编辑
作为替代方案,您还可以使用TextBox
:的onchange
事件在JavaScript中触发回发
<script type="text/javascript">
valueChanged = function(rowIndex){
__doPostBack("<%= GridView1.ClientID %>", rowIndex);
}
</script>
<asp:GridView ID="GridView1" runat="server" DataKeyNames="ID" ...>
<Columns>
<asp:TemplateField>
<asp:TextBox ID="TextBox1" runat="server" onchange='valueChanged(<%# Container.ItemIndex %>);' />
</asp:TemplateField>
</Columns>
</asp:GridView>
在后面的代码中,覆盖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 Property True
。
protected void TextBox_TextChanged(object sender, EventArgs e)
{
int CurrentGridIndex = ((GridViewRow)((TextBox)sender).NamingContainer).RowIndex
}