【问题标题】:DropDownList within composite control is losing selected value on postback复合控件中的 DropDownList 在回发时丢失所选值
【发布时间】:2010-06-06 23:00:06
【问题描述】:

我正在构建一个复合服务器控件,该控件当前只有一个 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 没有选择它。

我很确定这将是显而易见的事情,但我只是在这里旋转我的轮子。

【问题讨论】:

    标签: asp.net composite-controls


    【解决方案1】:

    发生这种情况是因为您在每次页面加载时都添加了 ListItems。不要在 PostBack 上重新创建列表项,ViewState 会恢复它们。

    【讨论】:

    • 我不认为是这样(尽管稍后有机会我会仔细检查),因为我可以在普通的 ASPX 页面(不是控件的一部分)上创建 DropDownList,并重新初始化其 Items 集合并在每次页面加载时在 Page.OnInit 中设置默认值,在这种情况下,它会正确恢复 OnInit 和 OnLoad 之间的发布值。
    • 老实说,我猜这可能取决于视图状态。如果您仍在为此苦苦挣扎而 Bryan 的解决方案没有帮助,我刚刚发布的另一个问题的答案可能会有所帮助:stackoverflow.com/questions/3854193/3865762#3865762
    • 欧文 - 我现在才注意到您的评论,链接的答案确实是正确的。如果您在这个问题上发布了其中的 1/4,我可以将其标记为已回答。
    猜你喜欢
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 2015-01-17
    • 1970-01-01
    • 2010-11-21
    • 2018-04-23
    • 2016-02-14
    相关资源
    最近更新 更多