0

最近、プリンターを表す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イベントは引き続きトリガーされます。ありがとう

4

1 に答える 1

1

遅くともページのロードイベントのすべてのポストバックで動的に作成されたコントロールを再作成する必要があります。

これは、イベントをトリガーし、ViewStateを正しくロードするために必要です。そうしないと、ポストバックデータが失われ、変更が表示されなくなります(fe Checked-state of aCheckBoxまたはTextプロパティのTextBox)。

イベントハンドラー(page_loadより後)で動的にコントロールを作成できますただし、遅くともページの読み込み時にそれらを再作成する必要があります(page_initの方が良い)。

動的に作成されたコントロールをループする

于 2012-03-04T09:48:42.280 に答える