我需要使用 DetailsView 构建一个网页,它有一堆文本框和绑定到 ObjectContainerDataSource 的下拉列表。这是用于使用 InsertItemTemplate 的单向绑定。
我可以很容易地使用静态定义的字段来使文本框和下拉列表都工作,但是我的特殊情况需要在运行时添加字段,因为网页需要高度可配置。
对于文本框,这很容易通过 BoundField 类,但是当我尝试将 TemplateField 用于下拉列表时,这一切都变得非常糟糕。我尝试了许多不同的方法,包括编写自己的 TemplateField 类,以及直接使用 CompiledBindableTemplateBuilder 设置 InsertItemTemplate。但无论我做什么,基本问题是单击插入按钮后,TemplateFields 不会绑定到对象数据源。我相信这是因为 InsertItemTemplate 在回发时为空(请注意,当所有字段都在标记中声明时, InsertItemTemplate 不为空)。如果有人完全按照我想做的事情做,请回复,因为我现在对此束手无策。
我已经恢复到模板字段中的简单 TextBox 以进行概念验证,但它也不起作用。我已经粘贴了我在下面所做的事情。在这种情况下,我试图将 TextBox 输入绑定到一个名为“CustomerRef”的属性。我认为我的问题可能与我如何设置 Text 属性有关,但我无法找到任何其他方法在后面的代码中将 Text 属性设置为 Bind(...) 。
这就是我插入模板化字段的方式:
var tf = new TemplateField();
tf.InsertItemTemplate = new CompiledBindableTemplateBuilder(delegate(Control container)
{
TextBox text = new TextBox();
text.ID = "MyTextBoxId";
text.Attributes.Add("Text", "<%# Bind(\"CustomerRef\") %>");
container.Controls.Add(text);
},
delegate(Control container)
{ // I've tried throwing an exception in here but it never gets executed
OrderedDictionary dict = new OrderedDictionary();
dict["CustomerRef"] = ((TextBox)container.Controls[0]).Text;
return dict;
});
这就是我将字段添加到我的 DetailsView 字段列表的方式:
ShipmentSearchView.Fields.Add(tf);
我在文本框中输入了一些文本并按下插入按钮......然后在我的事件处理程序中为插入事件我尝试获取这样的数据源:
var dataSource = e.Instance as MyClassName;
此时在调试环境中,我注意到有问题的字段不再具有 InsertItemTemplate - 它为空,并且未设置 MyCustomerRef。
我尝试在 Page_Load() 中的各个地方添加字段 - 在每次回帖时和仅在第一次加载时;在 Page_Init() 以及详细信息视图的 Init() 事件中,但我的做法似乎从来没有什么不同。提前感谢您对此问题的任何帮助。