我对网络编程很陌生,我仍然很难掌握服务器有一个可怕的短期记忆这一事实,忘记了你看到屏幕上的内容。
我目前正在尝试创建一个自定义控件,允许您编辑转发器内的数据字段。根据字段的格式(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方法,该方法因为尝试访问而立即出错文本框或不再存在的下拉列表。我的问题是,如何获得用户输入/选择的值?我认为我必须在生命周期的早期重新创建控件,我只是不确定何时。
答案 0 :(得分:0)
asp:Repeater不是编辑数据的理想控件,它更常用于显示。适合编辑的是FormView,DetailsView,在你的情况下最好的可能就是ListView控件。您可以为显示(ItemTemplate),编辑(EditItemTemplate)和插入(InsertItemTemplate)定义单独的模板。 Value属性需要一个setter来允许双向绑定。使用Bind而不是Eval。
希望这有帮助。
答案 1 :(得分:0)
根据建议,我将代码移到了PageLoad事件中。现在,在需要查找值时正确构造控件,并且viewstate神奇地保留了所有值。
我尝试将构造放在Init中,但是此时尚未分配控件属性,因此字段的格式仍为null,因此抛出了错误。