ソースコードを提供していないため、実際にあなたの問題を理解しているかどうかはわかりませんが、とにかく答えようとします.
この動作を回避するには、いくつかのオプションがあります。
- TextBox の
AutoPostback
-Property を に設定しますtrue
。このようにして、TextChanged-Event は、ユーザーがテキスト ボックスに何かを入力してEnter キーを押すか、テキスト ボックスのフォーカスを離れた直後に発生します。
- デフォルトでチェックマークを非表示にする必要があります(
Visible="false"
)
- 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 が自分で答えまたは回避策を見つけたと確信しています。とにかく、この単純化された作業サンプルと彼自身のコードの違いを他の誰かが確認するのに役立つかもしれません。