0

現在、TextBox と DropDownList のみを持つ複合サーバー コントロールを構築しています。これは、そのすべての胎児の栄光のコードです。

public Address : CompositeControl
{
    private string[] _states = new string[]
    {
        string.Empty, "ACT", "NSW", "VIC", "QLD", "SA", "WA", "NT", "TAS"
    };
    private TextBox _street;
    private DropDownList _state;

    public string Street
    {
        get { return _street.Text; }
        set { _street.Text = value; }
    }
    public string State
    {
        get { return _state.Text; }
        set { _state.Text = value; }
    }

    public Address() : base()
    {
        EnsureChildControls();
    }

    protected override void CreateChildControls()
    {
        _street = new TextBox();
        _state = new DropDownList();

        _state.Items.AddRange(
            Array.ConvertAll<string, ListItem>(_states, ListItem.FromString));

        Controls.Add(_street);
        Controls.Add(_state);
    }
}

コントロールは、宣言的な値が設定されるまで、ポストバック全体で正しく機能するように見えます。たとえば、次のようになります。

<squee:Address runat="server" ID="a" Street="123 Fake St" State="VIC" />

この後、テキスト ボックスは引き続き正しく機能しますが、_state メンバーはポスト バックされた値を取得せず、代わりに宣言された値に固執します。Request オブジェクトで未加工の投稿された値を確認したところ、リストの UniqueID の新しい値がそこにありますが、_state はそれを取得しません。

これは明らかなことだと確信していますが、ここでは車輪を回転させているだけです。

4

1 に答える 1

1

これは、ページの読み込みごとに ListItems を追加しているためです。PostBack でリスト項目を再作成しないでください。ViewState がそれらを復元します。

于 2010-02-23T03:02:44.123 に答える