当SelectedIndexChanged被触发时,如何使GridView中的TextBox不激活TextChanged?

时间:2010-06-21 15:52:23

标签: c# asp.net gridview textbox selectedindexchanged

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

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

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

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

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

有几种方法可以避免这种行为:

  1. 将TextBox'AutoPostback - 属性设置为true。通过这种方式,TextChanged-Event将在用户在文本框中输入内容并按 Enter 或保留文本框焦点
  2. 后直接发生。
  3. 您应该默认隐藏CheckMark(Visible="false"
  4. 您不得重新绑定GridView OnSelectedIndexChanging,只能将SelectedIndex设置为e.NewSelectedIndex。通过这种方式,用户已经更改的文本框的文本将不会被旧的db-values覆盖
  5. 这是一个简单的例子来说明我的意思:

    <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同时已经找到了答案或解决方法,也许它对其他人来说有助于看到这个简化的工作样本和他自己的代码之间的差异