2009-07-08 58 views
0

我想扩展DropDownList控件来简单地添加一个额外的属性。添加一个额外的属性到asp.net DropDownList

代码如下

Public Class CustomDropDownList 
    Inherits DropDownList 

    Private key As Int32 

    Public Property PrimaryKey() As Int32 
     Get 
      Return key 
     End Get 
     Set(ByVal value As Int32) 
      key = value 
     End Set 
    End Property 

End Class 

虽然包括很多来自其他来源的剪切/粘贴,似乎相当简单,我添加了一个局部变量,然后属性的get /组语句。

这有什么不对吗?我在与获得返回0的问题,即使我已经执行在此之前设定。

干杯! :d

编辑:

为了清楚起见,我用我的customDropDownList中继器,并在其ItemDataBound事件,我做了以下

If e.Item.ItemType = ListItemType.Item OrElse e.Item.ItemType = ListItemType.AlternatingItem Then 
     Dim row As DataRowView = e.Item.DataItem 
     Dim cdlConst As CustomDropDownList = e.Item.FindControl("cdlConstituencies") 
     cdlConst.SelectedValue = row.Item("constituencyrefno") 
     cdlConst.PrimaryKey = row.Item("uniqueid") 
End If 

不过,如果我访问PrimaryKey属性在稍后的时间,我得到0 ..了selectedValue和所有其余做工精细。

回答

0

您似乎遇到的问题与viewstate有关。你的控制不会将PrimaryKey属性的值保存到控件的视图状态,所以值不回发之间依然存在。

下面就来演示如何做到这一点的文章的链接:ViewState and controls

0

您可以使用列表项的值参数,当你把它添加到DropDownList的

ddlMyDropDown.Items.Add(新的ListItem(obj.Name(),obj.PrimaryKey.ToString()));

你只是看看的SelectedValue为你PK

object obj = PrimaryKeyParse(ddlMyDropDown.SelectedValue); 

对不起,这是在C#中,不知道它是什么样子的VB ...让我去看看:

ASPX:

<asp:DropDownList ID="ddlMyDropDown" runat="server"> 
    <asp:ListItem Text="-- Select --" Value="0" Selected="True"></asp:ListItem> 
    <asp:ListItem Text="ObjectName 1" Value="PK00001" ></asp:ListItem> 
    <asp:ListItem Text="ObjectName 2" Value="PK00002" ></asp:ListItem> 
</asp:DropDownList> 

HTML:

<select name="ddlMyDropDown" id="ddlMyDropDown"> 
    <option selected="selected" value="0">-- Select --</option> 
    <option value="PK00001">ObjectName 1</option> 
    <option value="PK00002">ObjectName 2</option> 
</select> 
+0

BBV您好,感谢您的帮助。虽然我不完全确定你会得到什么,但我没有改变我的ddl以任何方式处理它的项目集合的方式。我刚刚添加了额外的属性。所以上面应该和任何普通的dropDownList相同。 为了清晰起见,我将添加更多信息。 – 2009-07-08 15:20:42

+0

Ahhh您需要将该属性添加到该对象的视图状态......查看Zachary的答案 – BigBlondeViking 2009-07-08 15:29:55

0

理想情况下你应该做的就是绑定的对象,当您想要的SelectedItem只投它,因为它是有界的对象,你通常会做绑定到一个列表时,然后。

对于以下示例,假设Foo是一个具有2个属性的类... PK和名称;

MyDropDownList.DataSource = new List { 
    new Foo {PK = 1, Name = "Hello"}, 
    new Foo {PK = 2, Name = "something else"} 
}; 
MyDropDownList.DataTextField = "Name"; 
MyDropDownList.DataValueField = "PK" 
MyDropDownList.DataBind(); 

现在,在一些情况下,你可以这样做:

var theItem = (Foo)MyDropDownList.SelectedItem; 
var mm = theItem.PK; //now you can access your object's properties 

通过上述方法,你并不需要延长一个DropDownList,但只使用类的现有属性,让您的数据。

+0

感谢您的帮助,我可能会误导您中的一些人并为此而道歉。我的下拉列表基本上是一个名称/ ID对的查找表。我按照你所展示的那样设置了它。然后我的数据源有一个字段,我想用下拉列表中的值更新 - 这是我希望在下拉列表中存储的这个数据源的主键 - 不是逐个项目,而是整个列表,然后我可以使用关于selecteditemchanged的任何更新的主键..谢谢!我想我要检查viewState问题.. – 2009-07-08 15:29:10

相关问题