1

我有一个TextBoxin aTemplateField应该GridView在它的TextChanged事件之后显示一个复选标记。

我还使GridView行可选。如果我选择一行,则整个GridView重新绑定并TextChangedTextBoxes. GridView当然,这会显示所有复选标记。

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

有什么建议么?

4

1 回答 1

0

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

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

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

于 2011-06-29T21:00:10.773 回答