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来绑定下拉列表)
解决方法
将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的列表数据,您可能希望对其进行缓存,因为每个“行”数据都会导致加载列表数据.
编辑:
既然你认为我不可能写一个快速的演示应用来证明它是如何工作的:
<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 举报,一经查实,本站将立刻删除。