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