微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

asp.net – 不能从代码隐藏在FormView上加载DropDownList?

我有一个UserControl,包含一个FormView,包含一个DropDownList.
FormView绑定到数据控件.

像这样:

<asp:FormView ID="frmEdit" DataKeyNames="MetricCode" runat="server" DefaultMode="Edit" DataSourceID="llbDataSource" Cellpadding="0" >
    <EditItemTemplate>
        <asp:DropDownList ID="ParentMetricCode"  runat="server" SelectedValue='<%# Bind("ParentMetricCode") %>' />
    </EditItemTemplate>
<asp:FormView>

我试图从代码隐藏填充DropDownList.如果这不包含在FormView中,我通常只会在Page_Load事件中执行此操作.但是,这在FormView中不起作用,因为一旦我尝试这样做,访问代码中的下拉列表,即:

theListcontrol = CType(formView.FindControl(listControlName),ListControl)

调用FormView的数据绑定机制,当然,它试图将DropDownList绑定到底层数据源,导致**’ParentMetricCode’具有一个无效的SelectedValue,因为它在列表中不存在项目. “参数名称:值…”错误,因为尚未填充DropDownList.

我尝试在FormView的DataBinding()事件中执行加载,但随后:

theListcontrol = CType(formView.FindControl(listControlName),System.Web.UI.WebControls.ListControl)

…失败,因为那时FormView.Controls.Count = 0.

这不可能吗? (我不想使用辅助ObjectDataSource来绑定下拉列表)

解决方法

直接在DropDownList上实现OnDataBinding.

将formview绑定到某些数据时,将触发DropDownList的OnDataBinding.此时,您可以将所需的值加载到列表中,并将所选值绑定到加载的列表.

这是一个例子:

<asp:DropDownList ID="ParentMetricCode"  runat="server" OnDataBinding="ParentMetricCode_DataBinding" />

然后实现OnDataBinding:

protected void ParentMetricCode_DataBinding(object sender,System.EventArgs e)
{            
    DropDownList ddl = (DropDownList)(sender);

    // Fill the list items however you want
    ddl.Items.Add(new ListItem("1","1"));
    ddl.Items.Add(new ListItem("2","2"));
    // etc...

    // Set the selected value
    ddl.SelectedValue = Eval("ParentMetricCode").ToString();
}

当DataBind你的FormView时,一切都会开始发挥它的魔力:)

此外,如果您从数据库或某些内容加载DropDownList的列表数据,您可能希望对其进行缓存,因为每个“行”数据都会导致加载列表数据.

编辑:
既然你认为我不可能写一个快速的演示应用来证明它是如何工作的:

在您的aspx文件包括

<asp:FormView ID="fvTest" runat="server">
    <ItemTemplate>
        <asp:DropDownList ID="ddlTest" runat="server" OnDataBinding="ddlTest_DataBinding"></asp:DropDownList>
    </ItemTemplate>
</asp:FormView>

然后在你的.cs文件中:

public class MockData
{
    public string ID { get; set; }
    public string Text { get; set; }
}

protected void Page_Load(object sender,EventArgs e)
{
    List<MockData> lst = new List<MockData>();
    lst.Add(new MockData() { ID = "3",Text = "Test3" });
    fvTest.DataSource = lst;
    fvTest.DataBind();
}

protected void ddlTest_DataBinding(object sender,System.EventArgs e)
{
    DropDownList ddl = (DropDownList)(sender);
    ddl.Items.Add("1");
    ddl.Items.Add("2");
    ddl.Items.Add("3");
    ddl.Items.Add("4");
    ddl.Items.Add("5");

    ddl.SelectedValue = Eval("ID").ToString();
 }

运行代码… DropDownList将加载所有值,并设置为在模拟对象中设置的正确选定值.

不知道我还能做些什么来证明它更好……我认为你错过了DataBinding的实际工作方式.如果您尝试在FormView级别执行此操作,则在实际绑定FormView之前不会生成控件.当绑定发生时,您可以通过实现它的OnDataBinding事件来触发模板中的每个控件来执行某些操作.此时,绑定对象的当前迭代及其值是可用的,您可以在其中看到我的代码执行Eval(“ID”).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐