最近、プリンターを表すWebユーザーコントロールをasp.netで作成しました。ユーザーコントロールには、IsCheckedプロパティを設定するために使用するチェックボックスが含まれています。
protected bool isChecked;
/// <summary>
/// Is printer selected
/// </summary>
public bool IsChecked
{
get { return isChecked; }
set { isChecked = value; }
}
protected void chkIsSelected_CheckedChanged(object sender, EventArgs e)
{
if (isChecked)
{
isChecked = false;
}
else
{
isChecked = true;
}
}
チェックボックス(複数選択も)を使用してプリンターを選択し、「選択を追加」ボタンを使用して、選択した「プリンター(ユーザーコントロール)」を追加できるようにしたい。
protected void btnSubmitSelection_Click(object sender, EventArgs e)
{
Dictionary<string, string> addResults = new Dictionary<string, string>();
foreach (PrinterControlSearch pctrl in printerControls)
{
if (pctrl.IsChecked)
{
addResults.Add(pctrl.printer.PrinterName, PrinterOperations.addPrinter(client, pctrl.printer));
}
}
}
Page_InitまたはPage_LoadイベントにWebユーザーコントロールを追加すると、すべて正常に機能します。CheckedChangedイベントは、メインページのAddSelectedボタンからのポストバックが実行され、IsCheckedプロパティがチェックされたチェックボックスの場合と同じように設定された後、チェックされたコントロールごとに1つずつトリガーされます。
ただし、たとえば検索ボタンからのポストバックによってトリガーされるメソッドを使用してWebユーザーコントロールをページに追加すると、コントロールは正常に表示されますが、CheckedChangedイベントがAddSelectedポストバックでトリガーされることはなく、IsCheckedプロパティは常にfalseです。それは決して設定されないので。私が使用するチェックボックスはAutoPostBackを引き起こしません。
なぜこれが発生し、どうすれば毎回動作させることができますか?
コントロールのViewStateに何らかの形で関連していると思いますが、Page_Loadイベントにコントロールを追加しても、ViewStateのcontainer.AddControl()メソッドの後にプロパティを設定しないため、あまり意味がありません。ページのライフサイクルに追いつくために、CheckedChangedイベントは引き続きトリガーされます。ありがとう