我有一个动态数据应用程序,使用两个表。对于其中一个表,我想根据另一个表中的列设置一个列,使用填充了另一个表中的值的下拉菜单。目前,此列是作为文本框项在页面上生成的。然而,Dynamic Data并没有提供一个下拉项来提供一个UIHint。我尝试修改Enumeration字段控件来做到这一点,但似乎无法让它工作。
我应该指定这用于从Insert页为其中一个表添加新条目。我想有插入页上的一个项目是根据另一个表中的列的值设置的,使用从另一个表中的列填充的值的下拉菜单。
是否使用了过滤器控件?
FilterControl属性返回当用户选择QueryableFilterRepeater为其生成的Label时应该接收焦点的控件。在我们的日期过滤器中,这可以是下拉列表或文本框。
也许看看这篇文章会对你有所帮助:http://www.olegsych.com/2010/07/understanding-aspnet-dynamic-data-filter-templates/所以实际上我自己设法弄清楚了这一点。您可以简单地修改现有字段模板之一的代码来做我想做的事情。
如前所述,其思想是在Insert页面上使用一个文本框作为数据输入,并将其转换为值的下拉列表,其中下拉列表由来自另一个表的数据组成。然后,用户将选择所需的值,并将其作为插入过程的一部分传递回数据库。首先在FieldTemplates文件夹中创建一个新控件。命名为DropDown。您将有您的ascx,代码背后的文件,和设计器文件。
然后,从Enumeration_Edit的ascx文件中取出代码,并将其复制到新的下拉控件的ascx文件中。您可能需要重命名DropDownList控件的ID。
使用后面的代码,从Enumeration_Edit控件的后面的代码复制代码,并修改它们以满足下拉菜单的需要。
你的PageLoad类应该是这样的:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
OnDataBinding();
}
SetUpValidator(RequiredFieldValidator1);
SetUpValidator(DynamicValidator1);
}
你的OnDataBinding应该这样设置:
public void OnDataBinding()
{
//Code for binding data from a query/stored proc to a dropdown should go here.
}
保留ExtractValues()和datcontrol()类,但可以去掉EnumType()类
还要确保添加您可能需要的任何参考。比较Enumeration_Edit控件和新控件背后的代码,可以弄清楚这一点。
现在,要使控件对要控制其数据插入的列的文本框起作用。您可以简单地将[UIHint("DropDown")]
添加到表的部分类的适当列项中,但这将在显示时将控件应用于该列的所有实例。我为每个表都设置了自定义页面,并且我只希望将此控件用于特定列的插入功能。因此,我修改了这个表的Insert页,使控制这个列的行看起来像这样:
<asp:DynamicField DataField="COLUMN_NAME" UIHint="DropDown" ReadOnly="true" />
这样做,您只将控件应用于此页面上的此列。您需要将ReadOnly值设置为true,否则它仍然会呈现为文本输入字段,而不是下拉框。
从那里,您的插入页应该有一个下拉栏的数据输入。
我只需要它用于这一列,因此将数据绑定到下拉列表的代码只设置为适用于这一列。您可以编写一个查询,根据绑定控件的列查找特定列的所有值,或者您可能只需要为每个列创建自己的字段模板,您需要为其创建一个下拉列表。