2 つのドロップダウンが相互依存している asp.net で編集フォームを構築するにはどうすればよいですか?
-
21-08-2019 - |
質問
小さな問題があり、ユーザーがオブジェクトのプロパティを編集できる編集ページをasp.netアプリケーションに作成しています。2 つのドロップダウン (カテゴリとグループ) があり、グループの数は選択したカテゴリに応じて異なります。私の目標は、編集中のオブジェクトに正しいカテゴリを表示し、グループのリストをロードして正しいグループを選択することです。問題は、selectedindexchanged イベントが決して起動されないことです。
page_load にカテゴリをロードしてカテゴリを設定すると、コードは次のようになります。
protected void Page_Load(object sender, EventArgs e)
{ string editid= Request["edit"] == null ? null : Request["edit"].ToString();
int id = Convert.ToInt32(editid);
if (link == null)
{
link = BLLink.Load(id, blm);
}
if (!IsPostBack)
{
group = BLGroup.Load(link.GroupId, blm);
category = BLCategory.Load(group.CategoryId, blm);
List<BLCategory> categories = BLCategory.LoadAll();
categoryDropDown.DataSource = categories;
categoryDropDown.DataTextField = "CategoryName";
categoryDropDown.DataValueField = "id";
categoryDropDown.SelectedValue = category.id.ToString(); //this one doesnt cause the event to fire??? Doesnt matter if it is called after the databind() method
categoryDropDown.DataBind();
}
}
実行したいイベント ハンドラーは、すべてのグループをロードし、ドロップダウンに値を入力して、正しいグループを選択する必要があります。
protected void categoryDropDown_SelectedIndexChanged(object sender, EventArgs e)
{
category = BLCategory.Load(Convert.ToInt32(categoryDropDown.SelectedValue), new TestModelDataContext());
if (category != null)
{
List<BLGroup> groups = BLGroup.LoadAll(category.id);
groupDropDown.DataSource = groups;
groupDropDown.DataTextField = "GroupHeading";
groupDropDown.DataValueField = "GroupId";
groupDropDown.DataBind();
if (group != null)
{
groupDropDown.SelectedValue = group.GroupId.ToString();
}
else
{
groupDropDown.SelectedIndex = 0;
}
}
}
何が間違っているのかわかりません。これは簡単なことのように思えますが、何が間違っているのでしょうか?
解決
このイベントを発生させるには、ユーザーの選択が変更されたときにページをポストバックする必要があります。これにより、ページ全体が更新されます (ただし、コントロールはその状態を保持する必要があります)。
この SelectedIndexChanged イベントはサーバー上で実行されており、選択されたアイテムが変更されたときの送信/ポストバックに関するプロパティが最初のドロップダウンにあると思います。
クライアント側の動作を取得するには、次の 2 つのことを行うことができます。
1) そのセクションを UpdatePanel でラップし、最初のリストの値が変更されたときに 2 番目のリストを更新します。
2) JavaScript クライアント側コードを使用して値をロードします。このコードは、最初の値で選択された値が変更されたときに起動され、リストを取得して 2 番目の値を埋めます。
2a)データソースへの呼び出しをラップし、jsonなどとして値を返すサービスを書くことができます。最初のボックスの値によって(これは望ましくありませんが、データセットのセキュリティとサイズに応じて可能です)。
オプション 1 は、おそらく、既存のコードベースを保持しながらクライアント側の動作を取得する最も簡単な方法です。