我在TextBox
中的TemplateField
中有一个GridView
,应该在TextChanged
事件后显示复选标记。
我还可以选择GridView
行。如果我选择一行,整个GridView
会重新绑定并触发TextChanged
中所有TextBoxes
的{{1}}事件。当然,这会显示所有复选标记。
我不想在用户未更改的任何行上显示复选标记。我认为最好的方法是阻止(取消附加?)GridView
事件,除非用户更改文本值。
有什么建议吗?
答案 0 :(得分:0)
我不确定我是否真的理解你的问题,因为你没有提供任何源代码,但我还是试着回答。
有几种方法可以避免这种行为:
AutoPostback
- 属性设置为true
。通过这种方式,TextChanged-Event将在用户在文本框中输入内容并按 Enter 或保留文本框焦点Visible="false"
)OnSelectedIndexChanging
,只能将SelectedIndex
设置为e.NewSelectedIndex
。通过这种方式,用户已经更改的文本框的文本将不会被旧的db-values覆盖这是一个简单的例子来说明我的意思:
<asp:gridview id="GridView1" runat="server" autogeneratecolumns="False" AutoGenerateSelectButton="true" OnSelectedIndexChanging="GridSelecting" OnRowDataBound="GridRowDataBound" >
<SelectedRowStyle BackColor="LightBlue" />
<columns>
<asp:TemplateField>
<ItemTemplate>
<asp:CheckBox ID="CheckMark" Checked="true" Enabled="false" visible="false" runat="server" />
<asp:TextBox ID="Textbox1" runat="server" AutoPostBack="false" OnTextChanged="TextChanged"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
</columns>
</asp:gridview>
代码隐藏:
protected void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack) {
BindGrid();
}
}
private void BindGrid()
{
DataTable source = new DataTable();
source.Columns.Add(new DataColumn("Value", typeof(string)));
DataRow row = source.NewRow();
row["Value"] = "A";
source.Rows.Add(row);
row = source.NewRow();
row["Value"] = "B";
source.Rows.Add(row);
row = source.NewRow();
row["Value"] = "C";
source.Rows.Add(row);
this.GridView1.DataSource = source;
this.GridView1.DataBind();
}
protected void TextChanged(object sender, EventArgs e)
{
var chk = ((TextBox)sender).NamingContainer.FindControl("CheckMark");
chk.Visible = true;
}
protected void GridSelecting(object sender, GridViewSelectEventArgs e)
{
this.GridView1.SelectedIndex = e.NewSelectedIndex;
}
注意:我确信原来的OP同时已经找到了答案或解决方法,也许它对其他人来说有助于看到这个简化的工作样本和他自己的代码之间的差异