2009-09-07 10 views
6

Tôi nghĩ điều này đơn giản như trong Access.DataGridViewComboBox Tên cột/giá trị như thế nào?

Người dùng cần phải thiết lập giá trị của một cột trong một DataTable hoặc là 1 hoặc 2.

tôi muốn trình bày một combobox hiển thị "ONE", "HAI" và thiết lập 1 hoặc 2 đằng sau hiện trường, như Tôi đã làm rất nhiều lần trong Access-Forms.

Ở phía bên kia, nếu bảng được hiển thị, nó sẽ không hiển thị 1 hoặc 2 nhưng chuỗi tương ứng trong ComboBox.

Làm cách nào để tôi có thể thực hiện tác vụ đơn giản này?

Trả lời

12

Tôi giả sử bạn có nghĩa là DataGridView, đó là dành cho Windows Forms, trong khi GridView là cho ASP.NET mặc dù bạn đã gắn thẻ câu hỏi của bạn như vậy.

Bạn liên kết dữ liệu với DataGridViewComboBoxColumn như thế nào? Bạn sẽ cần đặt các thuộc tính DisplayMember và ValueMember trên DataGridViewComboBoxColumn trong khi thiết lập DataSource của nó. Các liên kết MSDN để DisplayMember cho thấy một ví dụ, nhưng nó không hoàn toàn hiển thị những gì bạn đang yêu cầu vì nó đặt cả hai thuộc tính cho cùng một điều.

DisplayMember sẽ là văn bản bạn muốn người dùng xem và ValueMember sẽ là giá trị ẩn tiềm ẩn được liên kết với nó.

Vì lợi ích của một ví dụ, giả sử bạn có một lớp Choice trong dự án của bạn đại diện cho lựa chọn của bạn và trông như thế này:

public class Choice 
{ 
    public string Name { get; private set; } 
    public int Value { get; private set; } 
    public Choice(string name, int value) 
    { 
     Name = name; 
     Value = value; 
    } 

    private static readonly List<Choice> possibleChoices = new List<Choice> 
    { 
     { new Choice("One", 1) }, 
     { new Choice("Two", 2) } 
    }; 

    public static List<Choice> GetChoices() 
    { 
     return possibleChoices; 
    } 
} 

GetChoices() sẽ trả về một danh sách có chứa sự lựa chọn của bạn. Lý tưởng nhất là bạn sẽ có một phương thức như vậy trong một lớp dịch vụ, hoặc bạn có thể xây dựng danh sách riêng của mình ở nơi khác nếu bạn muốn (trong mã của biểu mẫu của bạn phía sau). Để đơn giản tôi đã gộp tất cả lại với nhau trong cùng một lớp.

Ở dạng của bạn, bạn sẽ liên kết danh sách để các DataGridViewComboBoxColumn như sau:

// reference the combobox column 
DataGridViewComboBoxColumn cboBoxColumn = (DataGridViewComboBoxColumn)dataGridView1.Columns[0]; 
cboBoxColumn.DataSource = Choice.GetChoices(); 
cboBoxColumn.DisplayMember = "Name"; // the Name property in Choice class 
cboBoxColumn.ValueMember = "Value"; // ditto for the Value property 

Bây giờ bạn sẽ thấy "One" và "Hai" trong combobox. Khi bạn nhận được giá trị được chọn từ nó, nó phải là giá trị 1 hoặc 2 nằm bên dưới.

Đó là ý tưởng đằng sau việc sử dụng DisplayMember/ValueMember. Điều này sẽ giúp bạn tiếp tục và giúp bạn điều chỉnh nguồn dữ liệu bạn đang sử dụng.

+0

Đây là câu trả lời hoàn hảo! Cảm ơn bạn Ahmad! Reinhard –

+2

Làm cách nào chúng ta có thể đọc giá trị được chọn của một ô thả xuống trong datagrid? – Meysam

+0

Không biết điều đó thật đơn giản! Cảm ơn – Jack

3

Đây là cách bạn đọc giá trị từ lưới điện khi giá trị trong những thay đổi combobox:

dataGridView1.EditingControlShowing += dataGridView1_EditingControlShowing; 

private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) 
{ 
    if (dataGridView1.CurrentCell.ColumnIndex == 0 && e.Control is ComboBox) 
    { 
     ComboBox comboBox = e.Control as ComboBox; 
     comboBox.SelectedIndexChanged += LastColumnComboSelectionChanged; 
    } 
} 

private void LastColumnComboSelectionChanged(object sender, EventArgs e) 
{ 
    var sendingCB = sender as DataGridViewComboBoxEditingControl; 
    object value = sendingCB.SelectedValue; 
    if (value != null) 
    { 
     int intValue = (int)sendingCB.SelectedValue; 
     //do something with value 
    } 
} 

nguồn: this post