2009-03-17 8 views
23

Tôi đang cố gắng để ràng buộc các tế bào ComboBox riêng biệt trong một DataGridView để một lớp tùy chỉnh, và giữ nhận được một lỗiDataGridViewComboBoxCell Binding - "giá trị không hợp lệ"

giá trị DataGridViewComboBoxCell không hợp lệ

Tôi hiện đang chỉ định nguồn dữ liệu cho ô là IList<ICustomInterface> từ một Từ điển mà tôi có. Tuy nhiên, khi thiết lập nguồn dữ liệu, chỉ mục cho ComboBoxCell không được đặt, do đó, nó có giá trị không hợp lệ được chọn.

Tôi đang cố gắng tìm cách để làm cho nó chọn giá trị thực, ví dụ: mục thứ 0 trong danh sách nó đã được đưa ra để loại bỏ lỗi này, hoặc tìm cách khác để giải quyết vấn đề. Bất cứ ai có bất cứ đề nghị?

+1

Bạn có thể đăng mã không? – JaredPar

Trả lời

26

Tôi đã quản lý để tìm giải pháp không lâu sau khi đăng câu hỏi. Đối với bất kỳ ai khác:

Vấn đề là tôi đã cố gắng gán DataGridViewComboBoxCell.Value cho một đối tượng, hy vọng rằng vì Ô bị ràng buộc với nguồn dữ liệu mà nó sẽ tự động tìm đối tượng trong nguồn và cập nhật.

Đây không phải là trường hợp thực sự, bạn thực sự cần đặt giá trị bằng giá trị của thuộc tính ValueMember để nó cập nhật chính xác giá trị và ràng buộc. Tôi tin rằng tôi đã sử dụng thuộc tính 'Tên' cho cả hai ValueMemberDisplayMember (kiểm soát cách hiển thị trong ô) để đặt Giá trị thành interface.ToString() (thay vì trường hợp giao diện) hoạt động trong phần lớn các trường hợp. Sau đó, tôi bắt và bỏ qua bất kỳ ngoại lệ DataError nào xảy ra trong khi tôi đang thay đổi nguồn xung quanh.

+3

Đối với bất kỳ ai khác tình cờ gặp điều này, bạn có nghĩa là thuộc tính ValueMember cần phải bằng giá trị ô - DisplayMember là trường tương ứng bạn muốn hiển thị – Chris

3

Sau giờ thử nghiệm, cuối cùng tôi đã tìm được giải pháp hoạt động.

// Create a DataGridView 
System.Windows.Forms.DataGridView dgvCombo = new System.Windows.Forms.DataGridView(); 

// Create a DataGridViewComboBoxColumn 
System.Windows.Forms.DataGridViewComboBoxColumn colCombo = new 

System.Windows.Forms.DataGridViewComboBoxColumn(); 

// Add the DataGridViewComboBoxColumn to the DataGridView 
dgvCombo.Columns.Add(colCombo); 

// Define a data source somewhere, for instance: 
public enum DataEnum 
{ 
    One, 
    Two, 
    Three 
} 

// Bind the DataGridViewComboBoxColumn to the data source, for instance: 
colCombo.DataSource = Enum.GetNames(typeof(DataEnum)); 

// Create a DataGridViewRow: 
DataGridViewRow row = new DataGridViewRow(); 

// Create a DataGridViewComboBoxCell: 
DataGridViewComboBoxCell cellCombo = new DataGridViewComboBoxCell(); 

// Bind the DataGridViewComboBoxCell to the same data source as the DataGridViewComboBoxColumn: 
cellCombo.DataSource = Enum.GetNames(typeof(DataEnum)); 

// Set the Value of the DataGridViewComboBoxCell to one of the values in the data source, for instance: 
cellCombo.Value = "Two"; 
// (No need to set values for DisplayMember or ValueMember.) 

// Add the DataGridViewComboBoxCell to the DataGridViewRow: 
row.Cells.Add(cellCombo); 

// Add the DataGridViewRow to the DataGridView: 
dgvCombo.Rows.Add(row); 

// To avoid all the annoying error messages, handle the DataError event of the DataGridView: 
dgvCombo.DataError += new DataGridViewDataErrorEventHandler(dgvCombo_DataError); 

void dgvCombo_DataError(object sender, DataGridViewDataErrorEventArgs e) 
{ 
    // (No need to write anything in here) 
} 

Đó là tất cả.

+1

@NaSo nhớ! bạn cần phải chữa trị vấn đề, không bỏ qua nó. bằng cách này, bạn đã ràng buộc một 'cellCombo.DataSource', điều đó hoàn toàn sai. trong thực tế 'DataGridViewComboBoxCell.DataSource' sẽ tự động bị ràng buộc khi bạn đặt' DataGridViewComboBoxColumn.DataSource' – Rzassar

2

Tôi đã gặp vấn đề tương tự.

Trong trường hợp của tôi, giải pháp là điền vào bộ điều hợp dữ liệu của bảng khóa ngoài. Điều này đã không được tự động điền và đây là nguyên nhân của vấn đề.

Trong Page_Load sự kiện:

Me.TblUserTypesTableAdapter.Fill(Me.DonateDataSet.tblUserTypes) 
1

Tôi gặp cùng một vấn đề. Sau khi populating cột ComboBox của tôi trong (unbouod) DataGrid, tôi giải quyết vấn đề của tôi bằng cách thiết lập thuộc tính ValueMember của DataGridViewComboBoxColumn Rõ ràng, chỉ dựa vào thuộc tính ToString() của các đối tượng trong ComboBox là không đủ.

đang thực tế:

/// <summary> 
/// Populate the dataGridSplitVolumes data grid with all existing qualifications for the plan. 
/// </summary> 
/// <param name="bonus"></param> 
private void PopulateDataGridSplitVolumes(Bonus_Group bonus) 
{ 
    try 
    { 
    List<Qualification> qualifications = Qualification.Load(this.groupBonus.PlanID, this.ConnectionString); 
    foreach (Qualification qual in qualifications) 
    { 
     DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn)this.dataGridSplitVolumes.Columns[0]; 
     col.Items.Add(qual);      
    } 
    SplitVolumeGrid_QualificationColumn.ValueMember = "Name"; 
    } 
    catch (Exception ex) 
    { 
#if DEBUG 
    System.Diagnostics.Debugger.Break(); 
#endif 
    throw ex; 
    } 
}//PopulateDataGridSplitVolumes  
0

Đặt một giá trị null vào ô:

dataGridView.CurrentRow.Cells[NAME].Value = null; 
9

Đây là giải pháp đơn giản của tôi khi sử dụng enums

ColumnType.ValueType = typeof (MyEnum); 
ColumnType.DataSource = Enum.GetValues(typeof (MyEnum)); 

bạn có thể làm điều đó ngay sau khi " InitializeComponent(); "

+0

Hoạt động thực sự tốt đẹp trong trường hợp của tôi, cảm ơn! – peterkodermac

+0

Giá trị của 'MyEnum' là gì? –

+0

enum bạn muốn trong combobox phù hợp với dữ liệu của bạn. – Sauleil

0

Vì lợi ích của mọi người không phải vật lộn nhiều như tôi đã làm.

Khi ràng buộc combo bạn đang thiết lập DisplayMember (những gì người dùng sẽ thấy) và ValueMember (những gì ứng dụng của bạn sẽ nhận được).

Sau khi thiết lập, bạn cần thiết lập Giá trị và đây là nơi không thành công. Về cơ bản, TYPE của giá trị cần phải là TYPE giống với ValueMember.

Vì vậy, nếu thành viên giá trị của bạn là ID rõ ràng là loại INT và bạn cần đặt giá trị của mình thành int ví dụ Cell.Value = 1 ;.

1

sử dụng handler DataError tổ chức sự kiện,

private void shahriartableDataGridView_DataError(object sender, DataGridViewDataErrorEventArgs e) 
     { 
      //You don't have to write anything here ! 
     } 

và DisplayMember và ValueMember kiểu dữ liệu của bạn nên được như vậy, trong trường hợp của tôi, tôi có CountryName cho cả hai. Mọi thứ đều tốt cho tôi ... !!

0

Tôi đã gặp sự cố tương tự. Tin nhắn đã được 100% tại chỗ. Các giá trị cho combobox giống như: Chính xác, StartsWith ... và tôi đã cố gắng thiết lập giá trị Exactă (không chính xác). Điều này đã xảy ra tự động khi tôi đang đọc DataTable cho DataGridView từ một tệp .xml với DataTable.ReadXml (...). Các giá trị trong tệp .xml bị tắt.