Элементы ListBox имеют другое значение, чем текст элемента
Я хочу, чтобы элемент ListBox
был заполнен. Хотя, каждый элемент должен иметь другое значение.
Поэтому, когда пользователь выбирает элемент и нажимает кнопку, будет вызываться метод, который будет использовать значение, которое имеет элемент выбора.
Я не хочу показывать значения элемента пользователю.
EDIT: Это не для ASP.NET, а для приложения Windows Forms. Я просто подумал, что пример HTML будет легко читаться.
У меня есть вдохновение из HTML:
<form>
<input type="radio" name="sex" value="Value1" /> Male
<br />
<input type="radio" name="sex" value="Value2" /> Female
</form>
Это также позволяет мне использовать разные значения, чем то, что видит пользователь.
Ответы
Ответ 1
Вы можете выбрать, что отображать, используя DisplayMember ListBox.
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; };
}
Ответ 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
Элементы имеют свойство "Tag", которое вы можете использовать для хранения любой требуемой информации (скрытой от пользователя).
ListViewItem myItem = new ListViewItem();
myItem.Text = "Users see this";
myItem.Tag = "Users don't see this";
(или установите соответствующие свойства в проводнике свойств)
Ответ 4
Как указано 1-м ответом, использование DisplayMember
работает, используете ли вы asp.net или winforms.
И чтобы еще немного прокомментировать это, он также работает, если вы используете старую версию стиля 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();
}
}
Enjoy
PS: @2-й пост Tag
недоступен ListBox
: поскольку он принимает массив object
, а не конкретный контейнер элементов, например ListView
... но вам не нужно в вашем случае. Tag
полезен, если вы хотите переносить дополнительные данные вместе с конкретными TreeViewItem
или ListViewItem
, например.
Кстати, Tag
определяется на уровне Control
и поэтому существует для Button
, Label
и т.д.... но, со своей стороны, я считаю, что неплохо хранить бизнес-данные в он (нетипизированный, UI связан...), кроме случаев ListView
и TreeView
, для которых он довольно удобен.
Ответ 5
Легко!
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);
}
}