私の Web フォームは、2 つの TextBox、2 つの Button、CheckBoxList (データベース クエリの結果にバインド)、および空の DropDownList として開始されます。
ユーザーが最初の TextBox に検索語句を入力して Enter キーを押す (または最初の [検索] ボタンをクリックする) と、GridView が表示され、データベースから取得された行が取り込まれます。ユーザーがいずれかの行で [選択] ボタンをクリックすると、DropDownList が読み込まれ (データベース クエリの結果にバインドされ)、有効になります (クエリが結果を返した場合、結果がなかった場合は無効のままになります)。2 番目のボタン (「設定の保存」) をクリックすると、関連するデータが DB に保存され、GridView の選択がクリアされ、DropDownList がクリアされて無効になります。
上記のすべての作品。問題は DropDownList に由来します。C# コードで SelectedIndex の変化を認識できません。コードをシャッフルする方法に応じて、インデックスは常に 0 (および DropDownList が最初の項目にとどまるように強制される) または -1 (およびリストが無効になる) のいずれかになります。
ドロップダウン リスト コード:
<asp:DropDownList ID="myList" runat="server" AutoPostBack="True"
DataTextField="MyName" DataValueField="MyID"
Enabled="False" onselectedindexchanged="myList_SelectedIndexChanged" />
C# コード:
protected void myGrid_SelectedIndexChanged(object sender, EventArgs e)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
if (myGrid.SelectedIndex >= 0)
{
int id = int.Parse(myGrid.Rows[myGrid.SelectedIndex].Cells[2].Text);
connection.Open();
string query = "..."; // Omitted for brevity; the query is correct
SqlDataSource source = new SqlDataSource(connectionString, query);
source.SelectParameters.Add("Param1", TypeCode.String, id.ToString());
DataTable dt = ((DataView)source.Select(DataSourceSelectArguments.Empty)).Table;
dt.AcceptChanges();
myList.DataSource = dt;
myList.DataBind();
myList.Enabled = myList.Items.Count != 0;
if (!myList.Enabled)
{
myList.Items.Add(new ListItem("No Results", "0"));
}
}
}
}
protected void myList_SelectedIndexChanged(object sender, EventArgs e)
{
// ((DropDownList)sender).SelectedIndex == -1
}
問題の解決策を探しているときに DropDownList にいくつかの問題があることを読みましたが、AutoPostBack="True" を設定するというメモ以外に、私が見つけた他の状況はどれも役に立ちませんでした。