Заставить элементы 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>

Это также позволяет мне использовать значения, отличные от того, что видит пользователь.


person CasperT    schedule 15.05.2009    source источник


Ответы (5)


Вы можете выбрать, что отображать, используя 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; };
}
person Fredrik Mörk    schedule 15.05.2009
comment
При использовании DisplayMember имеет смысл установить ValueMember=Value, а затем прочитать SelectedValue. - person Henk Holterman; 15.05.2009
comment
@Henk: +1, я согласен, я просто хотел указать, что вы можете получить доступ ко всему объекту, а не только к предварительно назначенным свойствам. - person Fredrik Mörk; 15.05.2009
comment
Привет, твой код вроде работает, спасибо. Хотя есть небольшая ошибка. Он не будет отображать текст элемента в списке. Пишет Namespace.SomeData.... Хотя часть значения работает отлично, спасибо! - person CasperT; 15.05.2009
comment
@касперт; рад, что это помогло. Свойство Text было просто примером, вы, конечно, можете использовать любое подходящее свойство из объектов для использования в вашем списке, просто установите DisplayMember на имя отображаемого свойства. - person Fredrik Mörk; 15.05.2009
comment
Я попытался установить его на = Text; поскольку это свойство, оно должно показывать клиентов в списке. Хотя вместо этого он по-прежнему пишет Namespace.SomeData в списке. - person CasperT; 15.05.2009
comment
Как выглядит объект, который вы добавляете в список (вы можете дополнить свой вопрос образцом кода)? - person Fredrik Mörk; 15.05.2009
comment
А, не подумал об этом. Теперь все работает идеально. Спасибо - person CasperT; 15.05.2009
comment
@FredrikMörk, где вы размещаете код в form_load? - person Andrey Kaplun; 14.05.2018
comment
Это работает!!!. Кстати, как мы можем сохранить выбранный статус для выбранного элемента (также можно выбрать несколько элементов) в классе?. возможно, как этот новый SomeData(){Value = 1, Text = One, Selected = true} и многие другие... SomeData(){Value = 2, Text = Two, Selected = false}... - person Rizkiramadhani; 14.09.2019

у элементов есть свойство под названием «Тег», которое вы можете использовать для хранения любой информации, которую вы хотите (скрытой от пользователя)

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

(или установите соответствующие свойства в проводнике свойств)

person second    schedule 15.05.2009
comment
Не могли бы вы показать пример? каждому элементу нужна своя индивидуальная ценность - person CasperT; 15.05.2009
comment
Вопрос о ListBox. Насколько я знаю, ListViewItem будет использоваться только внутри ListView. Можно ли использовать ListViewItem в ListBox? - person ToolmakerSteve; 12.05.2017

Очень просто:

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);
        }
person iTai Ortix    schedule 01.10.2015
comment
ListItem класс является частью WebControls, а не частью Windows Forms, как требует вопрос. - person ToolmakerSteve; 12.05.2017

Как указано в 1-й ответ использование DisplayMember работает независимо от того, используете ли вы asp.net или winforms.

И, чтобы прокомментировать немного больше, это также работает, если вы используете довольно старый способ Items.add добавления элементов в ListBox.

Просто для удовольствия, вот простая демонстрация того, что вам нужно (просто создайте новую форму и поместите на нее ListBox и Label):

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: @2nd post Tag недоступен для ListBox: потому что он принимает массив object, а не конкретный контейнер элементов, такой как ListView... но в вашем случае он вам не нужен. Tag полезен, когда вы хотите передать дополнительные данные, например, вместе с определенными TreeViewItem или ListViewItem. Кстати, Tag определяется на уровне Control и поэтому существует для Button, Label и так далее... но со своей стороны я думаю, что хранить в нем бизнес-данные (нетипизированные, связанные с пользовательским интерфейсом) - плохая идея. .) кроме случаев ListView и TreeView, для которых это весьма удобно.

person odalet    schedule 15.05.2009

Легко!

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

    }
person cexars    schedule 17.05.2013
comment
ListItem класс является частью WebControls, а не частью Windows Forms, как требует вопрос. - person ToolmakerSteve; 12.05.2017