使ListBox项具有与项文本不同的值

时间:2009-05-15 08:09:03

标签: c# winforms

我想要一个ListBox个项目。虽然,每个项目应该有不同的值。 因此,当用户选择一个项目并按下一个按钮时,将调用一个方法,该方法将使用选择项目所具有的值。

我不想向用户透露项目值。

编辑:这不适用于ASP.NET,适用于Windows窗体应用程序。我只是认为HTML示例很容易阅读。

我的灵感来自HTML:

<form>
<input type="radio" name="sex" value="Value1" /> Male
<br />
<input type="radio" name="sex" value="Value2" /> Female
</form>

这也允许我使用与用户看到的值不同的值。

5 个答案:

答案 0 :(得分:33)

您可以选择使用ListBox的DisplayMember显示的内容。

List<SomeData> data = new List<SomeData>();
data.Add(new SomeData() { Value = 1, Text= "Some Text"});
data.Add(new SomeData() { Value = 2, Text = "Some Other Text"});
listBox1.DisplayMember = "Text";
listBox1.DataSource = data;

当用户选择一个项目时,您可以从所选对象中读取值(或任何其他属性):

int value = (listBox1.SelectedItem as SomeData).Value;

更新:请注意,DisplayMember仅适用于属性,而不适用于字段,因此您需要稍微更改一下类:

public class SomeData
{
    public string Value { get; set; };
    public string Text { get; set; };
}

答案 1 :(得分:2)

项目有一个名为“Tag”的属性,您可以使用该属性存储您想要的任何信息(对用户隐藏)

ListViewItem myItem = new ListViewItem();
myItem.Text = "Users see this";
myItem.Tag = "Users don't see this";

(或在属性资源管理器中设置适当的属性)

答案 2 :(得分:2)

很简单:

foreach(var item in *Your Source List*)
        {
            ListItem dataItem =  new ListItem();
            dataItem.Text = "value to show";
            dataItem.Value = *another value you want*;
            listBox.Items.Add(dataItem);
        }

答案 3 :(得分:1)

正如the 1st answer所述,无论您使用的是asp.net还是winforms,DisplayMember的使用都有效。

如果您要使用相当旧的时尚Items.add方式向ListBox添加项目,还可以进行更多评论。

只是为了好玩,这里有一个简单的演示,你需要的东西(只需创建一个新的表格并放在它上面一个ListBox和一个标签):

public partial class Form1 : Form
{
    class Customer
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }

        public override string ToString()
        {
            return string.Format("{0} {1}", LastName, FirstName);
        }
    }

    public Form1() { InitializeComponent(); }

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);                        
        listBox1.DisplayMember = "LastName";            
        listBox1.DataSource = GetCustomers();
        //listBox1.Items.AddRange(GetCustomers().ToArray());            
    }

    private IEnumerable<Customer> GetCustomers()
    {
        return new List<Customer>()
        {
            new Customer() { FirstName = "Gustav", LastName = "MAHLER" },
            new Customer() { FirstName = "Johann Sebastian", LastName = "BACH" }
        };
    }

    private void lb_SelectedIndexChanged(object sender, EventArgs e)
    {
        label1.Text = listBox1.SelectedItem.ToString();
    }        
}

享受

PS:Tag ListBox不适用于object:因为它接受ListView的数组,而不是Tag之类的特定项容器。但是在你的情况下你不需要任何东西。当您想要携带其他数据以及特定的TreeViewItemListViewItem时,Tag非常有用。 顺便说一句,Control定义在Button级别,因此存在LabelListView等等......但就我而言,我认为这是相当的将业务数据存储在其中的一个坏主意(无类型,UI耦合......)除了TreeView和{{1}}这些相当方便的情况之外。

答案 4 :(得分:-1)

容易!

protected void Page_Load(object sender, EventArgs e)
    {
        llenaListBox(ListBox1, 0, 10);
    }

    private void llenaListBox(ListBox PoListBox, int PiMinimo, int PiMaximo)
    {
        int Li;
        for (Li = PiMinimo; Li <= PiMaximo; Li++)
        {
            ListItem obj = new ListItem();
            obj.Text  = Li.ToString();
            obj.Value = Li.ToString();
            PoListBox.Items.Add(obj);
        }

    }