用于短期记忆的ASP.NET自定义控件

时间:2011-04-12 09:36:44

标签: c# .net asp.net

我对网络编程很陌生,我仍然很难掌握服务器有一个可怕的短期记忆这一事实,忘记了你看到屏幕上的内容。

我目前正在尝试创建一个自定义控件,允许您编辑转发器内的数据字段。根据字段的格式(ElementFormat属性),应生成文本框或下拉列表。在我的页面标记内,我有:

<custom:EditFieldControl ID="EditFieldControl" 
    runat="server" 
    ElementId='<%#Eval("Id")%>'                                                       
    ElementValue='<%#Eval("Value")%>' 
    ElementFormat='<%#Eval("Format")%>' 
    Visible="false" />

控制代码隐藏看起来像这样:

public class EditFieldControl : WebControl
{ 
    private TextBox textBox;
    private DropDownList dropDownList;    

    protected override void CreateChildControls()
    {
        switch (The Format of the field)
        {
            case "Text":
            {
                textBox = new TextBox
                {
                    Text = The existing value,
                    CssClass = "FieldTextBox"
                };
                this.Controls.Add(textBox);
                break;               
            }
            case "DropDownList":
            {
                dropDownList = new DropDownList
                {
                    //go get possible values from the database
                    CssClass = "FieldDropDown"
                };
                this.Controls.Add(dropDownList);
                break;
            }
            default:
                throw new ArgumentException("Invalid Format Type");
        }
        base.CreateChildControls();
    }

    public string Value
    {
        get
        {
            switch (ElementFormat)
            {
                case "DropDownList":
                    return dropDownList.SelectedValue;
                default:
                    return textBox.Text;
            }
        }
    }
}

问题是,当单击“保存此字段”按钮时,服务器在转发器的该位中查找EditFieldControl,找到它,然后调用value方法,该方法因为尝试访问而立即出错文本框或不再存在的下拉列表。我的问题是,如何获得用户输入/选择的值?我认为我必须在生命周期的早期重新创建控件,我只是不确定何时。

2 个答案:

答案 0 :(得分:0)

asp:Repeater不是编辑数据的理想控件,它更常用于显示。适合编辑的是FormView,DetailsView,在你的情况下最好的可能就是ListView控件。您可以为显示(ItemTemplate),编辑(EditItemTemplate)和插入(InsertItemTemplate)定义单独的模板。 Value属性需要一个setter来允许双向绑定。使用Bind而不是Eval。

希望这有帮助。

答案 1 :(得分:0)

根据建议,我将代码移到了PageLoad事件中。现在,在需要查找值时正确构造控件,并且viewstate神奇地保留了所有值。

我尝试将构造放在Init中,但是此时尚未分配控件属性,因此字段的格式仍为null,因此抛出了错误。