【问题标题】:How can I make a TextBox in a GridView not fire TextChanged when SelectedIndexChanged is fired?触发 SelectedIndexChanged 时,如何使 GridView 中的 TextBox 不触发 TextChanged?
【发布时间】:2010-06-21 15:52:22
【问题描述】:

我在 TemplateField 中的 GridView 中有一个 TextBox,它应该在其 TextChanged 事件之后显示一个复选标记。

我还使GridView 行可选。如果我选择一行,整个GridView 将重新绑定并为GridView 中的所有TextBoxes 触发TextChanged 事件。当然,这会显示所有复选标记。

我不想在用户未更改的任何行上显示复选标记。我认为最好的方法是防止(取消附加?)TextChanged 事件,除非用户更改文本值。

有什么建议吗?

【问题讨论】:

  • 我遇到了非常相似的问题!
  • 能否请您详细说明一下您在 textchanged 事件和 gridview 选择行事件中到底在做什么?
  • 尝试处理事件并使用e.Cancel?有了更多信息,我可以给你更具体的方向,但这似乎是你要找的。​​span>

标签: c# asp.net gridview textbox selectedindexchanged


【解决方案1】:

我不确定我是否真的理解了你的问题,因为你没有提供任何源代码,但我还是试着给出答案。

有几个选项可以避免这种行为:

  1. 将文本框的AutoPostback-属性设置为true。这样,TextChanged-Event 将在用户在文本框中输入内容并按下 Enter 或离开文本框焦点后直接发生
  2. 你应该默认隐藏复选标记(Visible="false")
  3. 您不能重新绑定 GridView 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 同时已经自己找到了答案或解决方法,也许它无论如何有助于其他人看到这个简化的工作示例和他自己的代码之间的差异 em>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多