将文本框转换为动态数据中的下拉列表

时间:2013-03-22 12:07:14

标签: .net asp.net-dynamic-data

我有一个使用两个表的动态数据应用。对于其中一个表,我想根据另一个表中的列设置一个列,使用填充了该另一个表中的值的下拉列表。目前,此列在页面上生成为文本框条目。但是,动态数据不提供下拉项目来为此提供UIHint。我尝试修改Enumeration字段控件来执行此操作,但似乎无法使其工作。

我应该指定这是为了从其中一个表的Insert页面添加一个新条目。我想根据另一个表中列的值设置插入页面上的一个项目,使用从该另一个表中的列填充的值的下拉列表。

2 个答案:

答案 0 :(得分:1)

您使用过滤器控件吗?

当用户选择QueryableFilterRepeater为其生成的Label时,FilterControl属性返回应该获得焦点的控件。在我们的日期过滤器中,这可以是下拉列表或文本框。

也许查看这篇文章会对你有所帮助: http://www.olegsych.com/2010/07/understanding-aspnet-dynamic-data-filter-templates/

答案 1 :(得分:0)

所以我设法自己想出这个。您只需修改其中一个现有字段模板的代码即可执行我要执行的操作。

如上所述,我们的想法是在“插入”页面上为数据输入设置一个文本框,并将其转换为值的下拉列表,其中该下拉列表由另一个表中的数据组成。然后,用户将选择所需的值,并将其作为插入过程的一部分传递回数据库。

首先在FieldTemplates文件夹中创建一个新控件。将它命名为DropDown。你将拥有你的ascx,代码隐藏文件和设计器文件。

然后,从ascx文件中获取Enumeration_Edit的代码,并将其复制到新的下拉控件的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()和DataControl()类,但是你可以删除EnumType()类。

还要确保添加您可能需要的任何参考。比较Enumeration_Edit控件和新控件背后的代码来解决这个问题。

现在,要使控件在您希望它控制数据插入的列的文本框上工作。您只需将[UIHint("DropDown")]添加到表的部分类的相应列项中,但这会在显示时将控件应用于该列的所有实例。我为每个表都设置了自定义页面,我只希望这个控件用于特定列的插入功能。因此,我更改了此表的“插入”页面,使控制此列的行看起来像这样:

<asp:DynamicField DataField="COLUMN_NAME" UIHint="DropDown" ReadOnly="true" />

这样做只需在此页面上将控件应用于此列。您需要将ReadOnly值设置为true,否则它仍将呈现为文本输入字段而不是下拉列表。

从那里,您的插入页面应该有一个下拉列表,用于该列的数据输入。

我只需要这一列,因此将数据绑定到我的下拉列表的代码只能设置为适用于这一列。您可以编写一个查询,根据您绑定控件的列查找特定列的所有值,或者您可能只需要为每个列创建自己的字段模板,您需要有一个下拉列表对