C# 使列表框项目与项目文本具有不同的值

C# 使列表框项目与项目文本具有不同的值,c#,winforms,C#,Winforms,我想要一个装满物品的列表框。尽管如此,每个项目都应该有不同的值。 因此,当用户选择一个项目并按下按钮时,将调用一个方法,该方法将使用选择项目的值 我不想向用户透露项目值 编辑:这不是针对ASP.NET的,而是针对Windows窗体应用程序的。我只是觉得HTML示例很容易阅读 我的灵感来自HTML: <form> <input type="radio" name="sex" value="Value1" /> Male <br /> <input type

我想要一个装满物品的
列表框。尽管如此,每个项目都应该有不同的值。
因此,当用户选择一个项目并按下按钮时,将调用一个方法,该方法将使用选择项目的值

我不想向用户透露项目值

编辑:这不是针对ASP.NET的,而是针对Windows窗体应用程序的。我只是觉得HTML示例很容易阅读

我的灵感来自HTML:

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

男性

女性

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

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


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

您可以使用列表框的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;
更新:请注意,DisplayMember仅适用于属性,而不适用于字段,因此您需要稍微更改您的类:

public class SomeData
{
    public string Value { get; set; };
    public string Text { get; set; };
}
如所述,无论您使用的是asp.net还是winforms,都可以使用
DisplayMember

还有一点需要说明的是,如果您使用的是相当老式的
项目。添加
将项目添加到
列表框中的方式

为了好玩,这里有一个简单的演示,演示您需要什么(只需创建一个新表单,并在其上放置一个列表框和一个标签):

公共部分类表单1:表单
{
类客户
{
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共重写字符串ToString()
{
返回string.Format(“{0}{1}”,LastName,FirstName);
}
}
公共表单1(){InitializeComponent();}
受保护的覆盖无效加载(事件参数e)
{
基础荷载(e);
listBox1.DisplayMember=“LastName”;
listBox1.DataSource=GetCustomers();
//listBox1.Items.AddRange(GetCustomers().ToArray());
}
私有IEnumerable GetCustomers()
{
返回新列表()
{
新客户(){FirstName=“Gustav”,LastName=“MAHLER”},
新客户(){FirstName=“Johann Sebastian”,LastName=“BACH”}
};
}
私有无效lb_SelectedIndexChanged(对象发送方,事件参数e)
{
label1.Text=listBox1.SelectedItem.ToString();
}        
}
享受

PS:
标记
不可用于
列表框
:因为它接受
对象的数组
,而不是像
列表视图
那样的特定项目容器。。。但在你的情况下你不需要任何东西<例如,当您希望将附加数据与特定的
TreeItem
ListViewItem
一起携带时,code>Tag
非常有用。 顺便说一下,
标签
是在
控件
级别定义的,因此存在于
按钮
标签
等中。。。但就我而言,我认为在it中存储业务数据(非类型化、UI耦合…)是一个相当糟糕的主意,除了非常方便的
ListView
TreeView
案例之外。

简单

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);
        }

    }
受保护的无效页面加载(对象发送方,事件参数e)
{
llenaListBox(列表框1、0、10);
}
私有虚空llenaListBox(列表框PoListBox、int PiMinimo、int PiMaximo)
{
国际李;
对于(Li=PiMinimo;Li非常简单:

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);
        }

您能举个例子吗?每个项目都需要各自的值问题是关于
ListBox
。好的,
ListViewItem
只能在
ListView
中使用。在
ListBox
中使用
ListViewItem
是否有效?使用DisplayMember时,设置ValueMember=“Value”更有意义然后读SelectedValue@Henk:+1,我同意,我只是想指出,您可以访问完整的对象,而不仅仅是“预分配”属性。您好,您的代码似乎正常工作,谢谢。不过有一个小错误。它不会在列表框中显示项文本。它写入名称空间。SomeData…但是值部分工作得很好,谢谢!@caspert;很高兴它起到了帮助作用。文本属性只是一个示例,您当然可以使用对象中的任何合适属性在您的列表中,只需将DisplayMember设置为要显示的属性的名称。我尝试将其设置为=Text;因为它是属性,所以应该在列表框中显示客户端。尽管它仍然在列表框中写入Namespace.SomeData。
ListItem
类是
WebControls
的一部分,而不是
Windows窗体
的一部分n请求。
ListItem
类是
WebControls
的一部分,而不是问题所要求的
Windows窗体的一部分。
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();
    }        
}
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);
        }

    }
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);
        }