2009-05-15 27 views
19

Tôi muốn có một số mục là ListBox. Mặc dù, mỗi mục phải có giá trị khác nhau. Vì vậy, khi người dùng chọn một mục và nhấn một nút, một phương pháp sẽ được gọi sẽ sử dụng giá trị mà mục chọn có.Làm cho các mặt hàng của ListBox có giá trị khác với văn bản mục

Tôi không muốn tiết lộ giá trị mục cho người dùng.

EDIT: Đây không phải là dành cho ASP.NET, nó dành cho ứng dụng Windows Forms. Tôi chỉ nghĩ rằng ví dụ HTML sẽ dễ đọc.

Tôi có cảm hứng từ HTML:

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

này cũng cho phép tôi sử dụng giá trị khác với những gì người dùng thấy.

Trả lời

30

Bạn có thể chọn hiển thị bằng cách sử dụng DisplayMember của 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; 

Khi người sử dụng chọn một mục, bạn có thể đọc giá trị (hoặc bất kỳ tài sản khác) từ các đối tượng được chọn:

int value = (listBox1.SelectedItem as SomeData).Value; 

Cập nhật: lưu ý rằng DisplayMember chỉ làm việc với tài sản, không phải với các lĩnh vực , vì vậy bạn cần phải thay đổi lớp học của bạn một chút:

public class SomeData 
{ 
    public string Value { get; set; }; 
    public string Text { get; set; }; 
} 
+4

Khi sử dụng DisplayMember, bạn nên đặt ValueMember = "Value" và sau đó đọc SelectedValue –

+0

@Henk: +1, tôi đồng ý, tôi chỉ muốn chỉ ra rằng bạn có thể truy cập vào đối tượng đầy đủ, không chỉ "trước thuộc tính "được gán". –

+0

Xin chào, mã của bạn dường như hoạt động, cảm ơn. Có một lỗi nhỏ mặc dù. Nó sẽ không hiển thị mục Văn bản trong hộp danh sách. Nó viết Namespace.SomeData .... Phần giá trị hoạt động hoàn hảo mặc dù, cảm ơn! – CasperT

1

mục có một tài sản gọi là 'Tag', mà bạn có thể sử dụng để lưu trữ bất kỳ thông tin bạn muốn (ẩn từ người sử dụng)

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

(hoặc thiết lập các thuộc tính thích hợp trong nhà thám hiểm tài sản)

+0

bạn có thể hiển thị một ví dụ? mỗi mục cần giá trị riêng của chúng – CasperT

+0

Câu hỏi là về 'ListBox'. AFAIK, 'ListViewItem' chỉ được sử dụng bên trong' ListView'. Nó sẽ làm việc để sử dụng 'ListViewItem' trong một' ListBox'? – ToolmakerSteve

1

Như đã trình bày bởi the 1st answer, việc sử dụng các công trình DisplayMember cho dù bạn đang sử dụng asp.net hoặc winfor Cô.

Và để nhận xét thêm một chút, nó cũng hoạt động nếu bạn đang sử dụng kiểu thời trang khá cũ Items.add cách thêm các mục vào ListBox.

Chỉ cần cho vui, đây là một bản demo đơn giản về những gì bạn cần (chỉ cần tạo một hình thức mới và thả vào nó một ListBox và một 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(); 
    }   
} 

Thưởng thức

PS: @2nd postTag không có sẵn cho ListBox: bởi vì nó chấp nhận một mảng là object, không phải là vùng chứa mục cụ thể như ListView ... nhưng bạn không cần bất kỳ trường hợp nào trong trường hợp của mình. Tag hữu ích khi bạn muốn mang theo dữ liệu bổ sung cùng với ví dụ cụ thể là TreeViewItem hoặc ListViewItem. Nhân tiện, Tag được xác định ở cấp Control và do đó tồn tại cho Button, Label, v.v ... nhưng đối với phần của tôi, tôi nghĩ rằng lưu trữ dữ liệu nghiệp vụ trong đó không thành công (chưa được nhập, giao diện người dùng ghép đôi. ..) ngoài các trường hợp ListViewTreeView mà trường hợp khá thuận tiện.

-1

Dễ dàng!

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

    } 
+0

Lớp 'ListItem' là một phần của' WebControls', không phải là một phần của 'Windows Forms', như các yêu cầu câu hỏi. – ToolmakerSteve

3

Rất đơn giản:

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

Lớp 'ListItem' là một phần của' WebControls', không phải là một phần của 'Windows Forms', như các yêu cầu câu hỏi. – ToolmakerSteve

Các vấn đề liên quan