所以实际上我自己设法解决了这个问题。您可以简单地修改现有字段模板之一的代码来做我想做的事情。
如前所述,我们的想法是在“插入”页面上使用一个文本框来输入数据,并将其转换为值的下拉列表,其中该下拉列表包含来自另一个表的数据。然后,用户将选择所需的值,并将其作为插入过程的一部分传回数据库。
首先在 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,否则它仍会呈现为文本输入字段而不是下拉菜单。
从那里,您的插入页面应该有一个下拉菜单,用于在该列上输入数据。
我只需要它用于这一列,因此将数据绑定到我的下拉列表的代码仅设置为适用于这一列。您可以编写一个查询,根据您绑定控件的列查找特定列的所有值,或者您可能只需要为需要下拉列表的每一列创建自己的字段模板为。