Подтвердить что ты не робот

Элементы 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>

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

4b9b3361

Ответ 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);
        }

    }