我创建了一个包含 DropDownList 和其他一些控件的用户控件。我的用户控件有一个名为 UserName 的公共属性,这将有助于检索数据以填充下拉列表。
<uc1:MyUserControl runat="server" ID="ucDetails" UserName = '<%# Eval("UserName")%>' />
我在设置用户控件属性时发现了。对于UserName(请参阅上面的示例),在usercontrol的page_Load期间未设置该值。它是在父页面的DataBind事件期间设置的,这是在用户控件的page_load事件之后的方式。
从用户控件预测中,我仍可以调用检索数据的下一个最接近的事件是什么,然后将其绑定到我的DropDownList?
感谢您的帮助。
答案 0 :(得分:3)
如果要在ListView中的每个项目的数据绑定事件期间设置下拉列表,则在ListView控件上添加ItemDataBound事件的处理程序:
<asp:ListView ID="listView1" runat="server" OnItemDataBound="listView1_ItemDataBound">
现在,在代码隐藏中的那个事件处理程序中,获取此行/项的用户控件实例:
protected void listView1_ItemDataBound(object sender, ListViewItemEventArgs e)
{
var userControl = e.Item.FindControl("ucDetails") as UserControlClassName;
}
然后,您可以在用户控件上执行任何操作,例如在其上设置UserName属性和/或设置下拉列表的项目。
注意:如果您需要为每个项目设置不同的属性,您可以从ListViewItemEventArgs
对象获取当前项目的数据对象:e.Item.DataItem as [whatever type the data item should be]
。< / p>
或者,如果要确保在设置UserName之后始终填充下拉列表,则可以更新UserName属性的setter,以便它可以在&#39; s设置为有效的用户名(不为null或为空等),它(setter)调用一个方法来填充下拉列表。这样,在数据绑定ListView的页面生命周期中的哪个位置并不重要。这可能看起来像这样:
public string UserName
{
get { return _username; }
set
{
// Make sure new value is valid (not null/empty, exists, etc.)
if (string.IsNullOrEmpty(value))
// Do something (throw exception, show error, etc.)
else
{
_userName = value;
SetupDropDownList();
}
}
}
private string _userName;