2009-05-18 33 views
8

Tôi có một hộp danh sách đa lựa chọn mà tôi đang ràng buộc với một DataTable. DataTable chứa 2 cột mô tả và giá trị.Đặt mục đã chọn trong ListBox mà không cần lặp lại

Dưới đây là ListBox đang Populating:

DataTable copytable = null; 
       copytable = GlobalTable.Copy(); // GlobalTable is a DataTable 
       copytable.Rows[0][0] = "--ALL--"; 
       copytable.Rows[0][1] = "--ALL--"; 

       breakTypeList.DataSource = copytable; 
       this.breakTypeList.DisplayMember = copytable.Columns[0].ColumnName; // description 
       this.breakTypeList.ValueMember = copytable.Columns[1].ColumnName; // value 
       this.breakTypeList.SelectedIndex = -1; 

Tôi đang thiết mô tả như DisplayMember và giá trị như ValueMember của ListBox. Bây giờ tùy thuộc vào những gì giá trị được thông qua tôi cần phải thiết lập các mục đã chọn trong ListBox.

Dưới đây là mã của tôi:

ListBox lb = c as ListBox; 
lb.SelectedValue = valuePassedByUser; 

mà không hoạt động. Do đó tôi phải sử dụng mã bên dưới (nơi tôi lặp qua tất cả các mục trong hộp danh sách)

for (int i = 0; i < lb.Items.Count; i++) 
      { 
       DataRowView dr = lb.Items[i] as DataRowView; 
       if (dr["value"].ToString() == valuePassedByUser) 
       { 
        lb.SelectedIndices.Add(i); 
        break; 
       } 
      } 

Tôi muốn biết những gì còn thiếu/sai trong mã của mình. Tại sao là lb.SelectedValue = valuePassedByUser; chọn các mục không chính xác?

+0

Bạn có thể cung cấp thêm một số thông tin về chính xác bạn cần làm hay ví dụ hoàn chỉnh hơn về mã không? Đối tượng có đọc một trường từ cơ sở dữ liệu và đặt chỉ mục/giá trị đã chọn thành giá trị khớp trong hộp danh sách không? – ryanulit

+0

Hộp danh sách được phổ biến với một DataTable mà lần lượt có dữ liệu được lấy từ cơ sở dữ liệu. Mối quan tâm của tôi là nếu tôi đã đặt ValueMember trong khi điền danh sách, tại sao là lb.SelectedValue = valuePassedByUser; không hoạt động? –

Trả lời

7

Ok ... ở đây có câu trả lời khó tiêu hóa mà tôi chỉ nhận ra hôm qua. Đó là sai lầm của tôi mặc dù tôi đã không đề cập đến một điều quan trọng trong câu hỏi của tôi bởi vì tôi cảm thấy nó không liên quan đến vấn đề trong tay:

Dữ liệu trong bảng dữ liệu không được sắp xếp. Do đó, tôi đã đặt thuộc tính Sắp xếp của hộp liệt kê thành true. Sau đó tôi nhận ra Khi thuộc tính được sắp xếp của hộp danh sách hoặc thậm chí combo box được đặt thành true thì thành viên giá trị không được đặt đúng. Vì vậy, nếu tôi viết:

lb.SelectedValue = valuePassedByUser;

nó đặt một số mục khác như được chọn thay vì đặt giá trị khác có giá trịPassedByUser. Trong ngắn hạn nó messes với các chỉ số.

Ví dụ: nếu dữ liệu ban đầu của tôi là:

Index ValueMember DisplayMember 
1   A   Apple 
2   M   Mango 
3   O   Orange 
4   B   Banana 

Và tôi đã đặt sắp xếp = true. Sau đó, các mục listbox là:

Index ValueMember DisplayMember 
1   A   Apple 
2   B   Banana 
3   M   Mango 
4   O   Orange 

Bây giờ nếu tôi muốn thiết lập Banana theo sự lựa chọn, tôi chạy stmt:

lb.SelectedValue = "B";

Nhưng thay vì thiết lập Banana như được lựa chọn, nó đặt Orange như chọn. Tại sao? Bởi vì danh sách không được sắp xếp, chỉ số của Banana sẽ là 4. Vì vậy, mặc dù sau khi phân loại chỉ mục của Banana là 2, nó đặt chỉ số 4 là được chọn, do đó làm cho Orange được chọn thay vì Banana.

Do đó cho listbox sắp xếp, Tôi đang sử dụng đoạn mã sau để thiết lập các mục đã chọn:

private void SetSelectedBreakType(ListBox lb, string value) 
{ 
    for (int i = 0; i < lb.Items.Count; i++) 
    { 
     DataRowView dr = lb.Items[i] as DataRowView; 
     if (dr["value"].ToString() == value) 
     { 
      lb.SelectedIndices.Add(i); 
      break; 
     } 
    } 
} 
0

Hãy thử điều này: -

var listBox = c as ListBox; 
    var item = listBox.Items.FindByValue(fieldValue); 
    if (item != null) 
    listBox.SelectedValue = fieldValue; 
+2

Không có FindByValue trong bộ sưu tập Items. – norlando

1

Tôi nghĩ rằng cách duy nhất bạn sẽ có thể chọn nhiều mục là bằng cách sử dụng một vòng lặp foreach. Thuộc tính SelectedValue dường như chỉ trả về 1 mục. Nếu bạn muốn chọn nhiều hơn thì 1 mục bạn sẽ phải sử dụng:

var tempListBox = c As ListBox; 
if (tempListBox != null) 
    (tempListBox.SelectedItems.Add(tempListBox.Items[tempListBox.FindStringExact(fieldValue)]); 

Ngoài ra FindStringExact không tìm kiếm thông qua trường giá trị mà nó chỉ xem qua văn bản được hiển thị. Ngoài ra để cắt giảm mã có thể muốn truyền một biến mới như một hộp danh sách để bạn không tiếp tục truyền C dưới dạng hộp danh sách.

0

Bạn có thể sử dụng "FindByValue" như thế này:

ListBox.SelectedIndex = ListBox.Items.IndexOf(ListBox.Items.FindByValue(fieldValue)) 
0
this.Character.SetSelected(this.Character.Items.IndexOf(this.textBox1.Text),true); 
0

Đây là cách tôi giải quyết nó, sử dụng winforms, DotNet 4.6

listBox1.SelectedIndex = listBox1.FindString(stringInList); 
0

Nếu bạn không muốn vòng lặp cho các mục đã chọn, hãy truy xuất giá trị đã chọn của hộp danh sách từ sự kiện listBox_SelectedIndexChanged và thêm giá trị đó vào mảng toàn cục. Sau đó, bằng cách truy cập vào mảng đó, bạn sẽ nhận được các giá trị mong muốn được chọn là itemlist với bất kỳ vòng lặp nào.

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