2010-11-08 38 views
5

Có thể chạy qua mọi mục trong một combobox bằng cách sử dụng vòng lặp foreach không? Tôi sẽ làm như thế nào?C# loop thông qua combobox nơi nguồn dữ liệu là một datatable với văn bản

Điều này là tôi có một System.Data.DataRowView ở đó vì combobox được gắn vào DataTable. Làm cách nào để chuyển đổi từ đó sang string?

+0

bạn có đang thực hiện việc này để tìm một giá trị cụ thể trong combobox không? liên quan đến câu hỏi cuối cùng của bạn? –

Trả lời

15

Nói chung, nó trông như thế này:

foreach(object item in myComboBox.Items) 
{ 
    DataRowView row = item as DataRowView; 

    if(row != null) 
    { 
     string displayValue = row["myColumnName"].ToString(); 

     // do something 
    } 
    else 
     // error: item was not of type DataRowView 
} 

cũng thấy http://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.items.aspx

+0

cảm ơn u, làm thế nào tôi sẽ nhận được item.text? –

+0

item.ToString() sẽ cung cấp cho bạn giá trị được hiển thị trong hộp kết hợp cho mục cụ thể đó. – Remus

+0

@i là một cô gái, nếu bạn đang tìm kiếm một mục với văn bản cụ thể, có một phương pháp cho điều đó. –

3
foreach (var item in combobox1.Items) 
{ 
    //do stuff 
} 

Nếu bạn biết nội dung là một chuỗi, bạn có thể làm

foreach (object item in combobox1.Items) 
{ 
    string text = (item as string); 
    //do stuff with the text 
} 

Nếu bạn là sử dụng .net 3.5 trở lên, bạn có thể rút ngắn một chút bằng cách sử dụng phương thức Mở rộng Cast<T>()IEnumerable<T> (được thực hiện bởi ObjectCollection, loại ComboBox.Items):

foreach (string text in combobox1.Items.Cast<string>()) 
{ 
    //do stuff with the text 
} 
+0

cảm ơn u, làm thế nào tôi sẽ nhận được item.text? –

+0

cảm ơn bạn rất nhiều, có điều là tôi có 'System.Data.DataRowView' ở đó vì combobox được gắn vào datatable, làm cách nào để chuyển đổi frmo thành chuỗi –

+0

Bạn cần biết chỉ mục cụ thể của dữ liệu được hiển thị trong hộp tổ hợp và mục cuộc gọi [index]. Xin lỗi, tôi không thể giúp bạn nhiều hơn vì tôi không có kinh nghiệm liên quan đến Databinding trong WinForms. – Femaref

0

có - lặp thông qua bộ sưu tập các hạng mục điều khiển:

foreach(var item in this.myCombobox.Items) 
{ 
    //your code 
} 
+0

cảm ơn u, làm thế nào tôi sẽ nhận được item.text? –

+0

nó chủ yếu là item.ToString() giá trị – dexter

+0

cảm ơn u rất nhiều, điều là tôi có 'System.Data.DataRowView' có bởi vì combobox được gắn vào datatable, làm thế nào để tôi chuyển đổi frmo rằng chuỗi –

0
foreach(ListItem item in this.myCombobox.Items) 
{ 
    //... 
} 
0
foreach(object item in ComboBoxName.Items) 
{ 
    <dosomething> 
} 

tôi có thể nói gì nữa ? Điều này truy cập chúng theo thứ tự, nhưng tất cả sẽ là đối tượng. Tùy thuộc vào bạn để xác định loại của mặt hàng đó.

1

Có nó chỉ là một bộ sưu tập tiêu chuẩn. Ví dụ:

foreach(object item in myComboBox.Items) 

"đối tượng" có thể là (nhưng không nhất thiết) là một chuỗi. Nếu bạn biết nó luôn luôn là một chuỗi, bạn có thể thay đổi nó thành:

foreach(string item in myComboBox.Items) 
+1

mã thứ hai giành được 't làm việc, như myCombobox.Items là một bộ sưu tập các đối tượng. – Femaref

2

Dựa trên previous question của bạn, có vẻ như bạn muốn để lặp qua các mục để tìm một giá trị phù hợp với văn bản. Thay vào đó, bạn có thể sử dụng phương pháp ComboBox.FindStringExact để thực hiện tìm kiếm case-insensitive, mà sẽ trả về chỉ số của các trận đấu đầu tiên mà nó tìm thấy, hoặc -1 nếu nó không tìm thấy văn bản trong câu hỏi:

comboBox1.SelectedIndex = comboBox1.FindStringExact("4"); 
0

tôi đấu tranh cho các lứa tuổi với vấn đề này, vì tôi thường sử dụng các điều khiển ComboBox, được liên kết với một danh sách các lớp khác nhau của Danh sách <.

Tôi không thực sự muốn mã hóa tên trường trong chức năng của mình hoặc có chức năng SelectItemByValue riêng cho từng loại Danh sách <> lớp tôi muốn sử dụng.

Cuối cùng tôi đã đưa ra giải pháp tái sử dụng sau.

List<EmployeeRecord> m_listOfEmployees = GetListOfEmployees(); 
... 
comboBoxEmployees.DataSource = m_listOfEmployees; 
comboBoxEmployees.DisplayMember = "EmployeeName"; 
comboBoxEmployees.ValueMember = "EmployeeID"; 

Để chọn mục ComboBox với một ID người lao động cụ thể:

int someEmployeeID = 4; 
    ComboBoxHelper.SetComboBoxSelectionByValue<EmployeeRecord>(comboBoxEmployees, someEmployeeID); 

Và đây là những chức năng mà hiện công việc.

Giành mình, không đẹp.

public static void SetComboBoxSelectionByValue<T>(ComboBox ctrl, int? value) 
{ 
    // If the ComboBox has no items, disable it (so the user can immediately see there's nothing selectable) 
    ctrl.Enabled = (ctrl.Items.Count > 0); 

    int inx = 0; 
    foreach (T t in ctrl.Items) 
    { 
     foreach (PropertyInfo info in typeof(T).GetProperties()) 
     { 
      if (info.Name == ctrl.ValueMember) 
      { 
       object val = info.GetValue(t, null); 
       if (val.ToString() == value.Value.ToString()) 
       { 
        ctrl.SelectedIndex = inx; 
        return; 
       } 
      } 
     } 
     inx++; 
    } 

    if (ctrl.Items.Count > 0) 
     ctrl.SelectedIndex = 0; 
} 

Chú ý làm thế nào bạn có để gọi hàm, đi qua nó là loại của các đối tượng đang được lưu trữ trong mỗi ComboBoxItem (EmployeeRecord, trong ví dụ này), cùng với một con trỏ đến ComboBox của bạn và Giá trị của mục bạn muốn đặt làm SelectedItem.

ComboBoxHelper.SetComboBoxSelectionByValue<EmployeeRecord>(comboBoxEmployees, someEmployeeID); 

Chức năng bước qua mục trong ComboBox, tìm "ValueMember" lĩnh vực trong hồ sơ của mục đó (EmployeeID, trong ví dụ này) và so sánh giá trị của ValueMember với mong muốn giá trị tham số.

Tôi biết, tôi biết, nó không đẹp, nhưng khi bạn gắn một danh sách vào một ComboBox, thì bạn không thể sử dụng DataRowView:

DataRowView row = item as DataRowView; 
string displayValue = row["someColumnName"].ToString(); 

Và nếu bạn muốn một chức năng SetComboBoxSelectionByValue chung chung, mà sẽ làm việc với Danh sách của bất kỳ loại lớp nào, sau đó bạn cần bắt đầu tham gia vào PropertyInfos, để tìm giá trị của một trường trong lớp cụ thể của bạn.

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