1

我需要使用 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() 事件中,但我的做法似乎从来没有什么不同。提前感谢您对此问题的任何帮助。

4

1 回答 1

0

我最终编写了自己的自定义用户控件来实现这一点——这真的不难做到。如果有人对我的解决方案感兴趣,我很乐意在这里发布。但是由于对我的原始帖子缺乏评论,我猜我在我的网页上所做的事情并不是很多人都在尝试的!

于 2012-02-10T00:21:00.570 回答