2015-09-23 14 views
12

Tôi đang tạo combobox từ List của KeyValuePair<int, string>. Cho đến nay nó đã được làm việc rất tốt trong việc cung cấp cho người dùng tên mô tả trong khi trả lại cho tôi một id số.
Tuy nhiên, bất cứ điều gì tôi cố gắng, tôi không thể chọn giá trị ban đầu được chọn.Chọn giá trị được chọn ban đầu cho ComboBox có Danh sách KeyValuePair làm DataSource

public StartUpForm() 
{ 
    InitializeComponent(); 

    FlowLayoutPanel flowLayout = new FlowLayoutPanel(); //This is necessary to protect the table, which is for some reason collapsing... 
    flowLayout.FlowDirection = FlowDirection.TopDown; 
    flowLayout.AutoSize = true; 
    flowLayout.AutoSizeMode = AutoSizeMode.GrowAndShrink; 

    var comboBox = new ComboBox(); 

    { 
     var choices = new List<KeyValuePair<int, string>>(); 
     choices.Add(new KeyValuePair<int, string>(1, "hello")); 
     choices.Add(new KeyValuePair<int, string>(2, "world")); 
     comboBox.DataSource = choices; 
     comboBox.ValueMember = "Key"; 
     comboBox.DisplayMember = "Value"; 
     flowLayout.Controls.Add(comboBox); 
    } 
    Controls.Add(flowLayout); 

    //None of these work: 
    comboBox.SelectedValue = 2; 
    comboBox.SelectedValue = 2.ToString(); 
    comboBox.SelectedValue = new KeyValuePair<int, string>(2, "world"); 
    comboBox.SelectedValue = "world"; 
    comboBox.SelectedItem = 2; 
    comboBox.SelectedItem = 2.ToString(); 
    comboBox.SelectedItem = new KeyValuePair<int, string>(2, "world"); 
    comboBox.SelectedItem = "world"; 

    return; 
} 

Kết quả luôn luôn là như nhau:

enter image description here

Làm thế nào tôi có thể chọn giá trị ban đầu được lựa chọn trong một ComboBox sử dụng như DataSource một List<KeyValuePair<int, string>>?

Trả lời

8

Ràng buộc không hoạt động rất tốt trong các nhà xây dựng, vì vậy hãy thử di chuyển tờ khai ComboBox với phạm vi hình thức và hãy thử sử dụng ghi đè OnLoad:

ComboBox comboBox = new ComboBox(); 

protected override void OnLoad(EventArgs e) { 
    comboBox.SelectedValue = 2; 
    base.OnLoad(e); 
} 
+0

Tuyệt vời, nó hoạt động! Cảm ơn! Một câu hỏi: Làm thế nào là một trong những nghĩa vụ phải biết điều này? – Antonio

+0

@Antonio Đã xảy ra sự cố tương tự. . . nhiều năm trước. – LarsTech

0

Tại sao bạn đang sử dụng ràng buộc? Nó sẽ không thể dễ dàng hơn để tạo ra một lớp với int và các thuộc tính chuỗi và ghi đè ToString() để hiển thị các văn bản chuỗi:

public class ComboItem 
{ 
    public int Key {get; set;} 
    public string Text {get; set;} 
    public override string ToString() 
    { 
     return this.Text; 
    } 
} 

public void OnFormLoad(object Sender, ...) 
{ 
    IEnumerable<ComboItem> comboItems = CreateListComboItems(); 
    this.ComboBox1.Items.Clear(); 
    foreach (var comboitem in comboItems) 
    { 
     this.comboBox1.Items.Add(comboItem); 
    } 
} 

Theo dõi sự kiện ComboBox SelectedIndexChanged:

private void OnComboSelectedIndexChanged(object sender, EventArgs e) 
{ 
    ComboItem selectedItem = (ComboItem)this.comboBox1.SelectedItem; 
    ProcessSelectedKey(selectedItem.Key); 
} 

Phụ Lục : Tôi không thể chọn giá trị được chọn ban đầu.

Tôi đoán bạn muốn có thể lập trình chọn mục hộp kết hợp có Khóa có giá trị đã cho, khiến ComboBox hiển thị Văn bản thuộc khóa đó.

Mặc dù thuộc tính ComboBox.Items thuộc loại ComboBoxCollection, nó thực hiện IEnumerable, có nghĩa là bạn có thể sử dụng Enumerable.Cast() trên nó để đúc nó vào một chuỗi ComboItems. Sử dụng LINQ để tìm nếu có một ComboItem với phím yêu cầu và chọn người đầu tiên tìm thấy ComboItem, hoặc chọn hoặc chọn không có gì nếu không có ComboItem với phím

// selects the combobox item with key == value 
private void SelectComboItem(int value) 
{ 
    this.comboBox1.SelectedItem = 
     this.ComboBox1.Items.Cast<ComboItem>() 
      .FirstOrDefault(comboItem => comboItem.Key == value); 
} 

mã này sẽ có được bộ sưu tập của các mục trong hộp combo (mà chúng ta biết là một chuỗi các ComboItems), do đó chúng ta có thể đúc tất cả các mục vào một ComboItem. Sau đó, chúng tôi cố gắng tìm ComboItem đầu tiên có Khóa bằng giá trị. Trả về null nếu không có ComboItem như vậy. Cuối cùng biến nó thành mục đã chọn. Giá trị null chỉ ra để chọn không có gì

+1

Tại sao tái phát minh bánh xe? – Antonio

+0

Bạn có nghĩa là tại sao các mẫu tái sử dụng đã được chứng minh là hoạt động? Vâng (1) dễ sử dụng, (2) dễ hiểu đối với những thay đổi trong tương lai của lớp học, (3) dễ thay đổi, ví dụ nếu trong tương lai chúng ta cần hai giá trị chính thay vì –

+0

Cảm ơn gợi ý của bạn. Tôi phải nói rằng mặc dù điều này không giải quyết được câu hỏi của tôi, đó là về việc chọn giá trị ban đầu đã chọn. – Antonio

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