2012-06-21 42 views
15

Tôi có DataGridView với hai cột. Cột đầu tiên là TextBoxCol(DataGridViewTextBoxColumn) và cột thứ hai là ComboBoxCol(DataGridViewComboBoxColumn).Sự kiện xảy ra trong DataGridViewComboBoxColumn SelectedIndexChanged

Làm cách nào để thay đổi giá trị TextBoxCol khi ComboBoxCol thay đổi giá trị chỉ mục đã chọn? (Điều này sẽ xảy ra khi chỉ mục đã chọn thay đổi trong ComboBoxCol. Không phải sau khi rời khỏi cột, như dataGridView_CellValueChanged)

Tôi đã đọc một chủ đề với cùng một vấn đề mà tôi đang gặp nhưng tôi không hiểu câu trả lời (nên chính xác dựa trên dấu kiểm). Đây là liên kết. -Almost same topic

+0

Vui vì tôi có thể trợ giúp, tôi sẽ theo dõi thêm bất kỳ câu hỏi nào của bạn khi tôi đã có dự án mở :). – KreepN

+1

Bản sao có thể có của [Sự kiện nào bắt sự thay đổi giá trị trong combobox trong một DataGridViewCell?] (Http://stackoverflow.com/questions/5652957/what-event-catches-a-change-of-value-in-a -combobox-in-a-datagridviewcell) –

Trả lời

23

Cho hai phương pháp đơn giản một đi (của 1 'trong phương thức trên cùng là chỉ mục của cột combobox)

Dòng mà bạn sẽ làm cho bạn sửa đổi sẽ là dòng setter cel.Value =, vì bạn có thể thay đổi nó thành bất kỳ thứ gì bạn thích.


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

    private void LastColumnComboSelectionChanged(object sender, EventArgs e) 
    { 
     var currentcell = dataGridView1.CurrentCellAddress; 
     var sendingCB = sender as DataGridViewComboBoxEditingControl; 
     DataGridViewTextBoxCell cel = (DataGridViewTextBoxCell)dataGridView1.Rows[currentcell.Y].Cells[0]; 
     cel.Value = sendingCB.EditingControlFormattedValue.ToString(); 
    } 

enter image description here

+8

Đảm bảo bạn cũng loại bỏ mọi trình xử lý sự kiện hiện có bằng 'comboBox.SelectedIndexChanged - = LastColumnComboSelectionChanged;' – Smashery

2

Liên kết đó là chính xác. Xử lý EditingControlShowing event của DataGridView. Trong trình xử lý sự kiện này, hãy kiểm tra xem cột hiện tại có thuộc sở thích của bạn hay không. Và, sau đó tạo ra một đối tượng combobox tạm thời: -

ComboBox comboBox = e.Control as ComboBox;

MSDN có một mẫu: Xem trong ví dụ phần here. Lưu ýInheritance Hierarchy & Class Syntax trong liên kết MSDN: -

public class DataGridViewComboBoxEditingControl: ComboBox, IDataGridViewEditingControl

private DataGridView dataGridView1 = new DataGridView(); 

private void AddColorColumn() 
{ 
    DataGridViewComboBoxColumn comboBoxColumn = 
     new DataGridViewComboBoxColumn(); 
    comboBoxColumn.Items.AddRange(
     Color.Red, Color.Yellow, Color.Green, Color.Blue); 
    comboBoxColumn.ValueType = typeof(Color); 
    dataGridView1.Columns.Add(comboBoxColumn); 
    dataGridView1.EditingControlShowing += 
     new DataGridViewEditingControlShowingEventHandler(
     dataGridView1_EditingControlShowing); 
} 

private void dataGridView1_EditingControlShowing(object sender, 
    DataGridViewEditingControlShowingEventArgs e) 
{ 
    ComboBox combo = e.Control as ComboBox; 
    if (combo != null) 
    { 
     // Remove an existing event-handler, if present, to avoid 
     // adding multiple handlers when the editing control is reused. 
     combo.SelectedIndexChanged -= 
      new EventHandler(ComboBox_SelectedIndexChanged); 

     // Add the event handler. 
     combo.SelectedIndexChanged += 
      new EventHandler(ComboBox_SelectedIndexChanged); 
    } 
} 

private void ComboBox_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    ((ComboBox)sender).BackColor = (Color)((ComboBox)sender).SelectedItem; 
} 
28

Câu trả lời này đang trôi nổi xung quanh trong một vài nơi. Sử dụng DataGridViewEditingControlShowingEventHandler sẽ kích hoạt nhiều sự kiện hơn bạn dự định. Trong thử nghiệm của tôi, nó đã kích hoạt sự kiện này nhiều lần. Cũng sử dụng combo.SelectedIndexChanged - = sự kiện sẽ không thực sự loại bỏ sự kiện, họ chỉ giữ xếp chồng. Dù sao, tôi tìm thấy một giải pháp mà dường như làm việc. Tôi bao gồm mẫu mã bên dưới:

  // Add the events to listen for 
     dataGridView1.CellValueChanged += 
      new DataGridViewCellEventHandler(dataGridView1_CellValueChanged); 
     dataGridView1.CurrentCellDirtyStateChanged += 
      new EventHandler(dataGridView1_CurrentCellDirtyStateChanged); 

    // This event handler manually raises the CellValueChanged event 
    // by calling the CommitEdit method. 
    void dataGridView1_CurrentCellDirtyStateChanged(object sender, 
     EventArgs e) 
    { 
     if (dataGridView1.IsCurrentCellDirty) 
     { 
      // This fires the cell value changed handler below 
      dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit); 
     } 
    } 

    private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) 
    { 
     // My combobox column is the second one so I hard coded a 1, flavor to taste 
     DataGridViewComboBoxCell cb = (DataGridViewComboBoxCell)dataGridView1.Rows[e.RowIndex].Cells[1]; 
     if (cb.Value != null) 
     { 
       // do stuff 
       dataGridView1.Invalidate(); 
     } 
    } 
+1

Điều này thực sự tốt hơn giải pháp được chấp nhận. Điều duy nhất tôi phải thay đổi là thêm nếu (e.RowIndex == -1) trả lại; đến đầu hàm dataGridView1_CellValueChangeed – Kevin

+0

giải pháp tuyệt vời, cần được chấp nhận –

+2

Đúng, chắc chắn là giải pháp tốt hơn, giải pháp được chọn sẽ kích hoạt sự kiện nhiều lần. –

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