1

イベントの後にチェックマークを表示するはずのTextBoxin a TemplateFieldin aがあります。GridViewTextChanged

行もGridView選択可能にしました。行を選択すると、全体がGridView再バインドされ、 内のすべてのイベントTextChangedが発生します。もちろん、これはすべてのチェックマークを表示します。TextBoxesGridView

ユーザーが変更していない行にチェックマークを表示したくありません。TextChangedこれを行う最善の方法は、ユーザーがテキスト値を変更しない限り、イベントを防止 (アタッチ解除) することだと思います。

助言がありますか?

4

1 に答える 1

0

ソースコードを提供していないため、実際にあなたの問題を理解しているかどうかはわかりませんが、とにかく答えようとします.

この動作を回避するには、いくつかのオプションがあります。

  1. TextBox のAutoPostback-Property を に設定しますtrue。このようにして、TextChanged-Event は、ユーザーがテキスト ボックスに何かを入力してEnter キーを押すか、テキスト ボックスのフォーカスを離れた直後に発生します。
  2. デフォルトでチェックマークを非表示にする必要があります( Visible="false")
  3. GridView を再バインドする必要はありませんOnSelectedIndexChangingが、に設定するだけSelectedIndexですe.NewSelectedIndex。このようにして、ユーザーによって既に変更されたテキストボックスのテキストは、古いデータベース値から上書きされません。

これは、私が何を意味するかを示す簡単な例です。

<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 に答える