加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-16 06:53:04 所属栏目:asp.Net 来源:网络整理
导读:我有一个UserControl,包含一个FormView,包含一个DropDownList. FormView绑定到数据控件. 像这样: asp:FormView ID="frmEdit" DataKeyNames="MetricCode" runat="server" DefaultMode="Edit" DataSourceID="llbDataSource" Cellpadding="0" EditItemTemplate
我有一个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”).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读