2012-01-03 16 views
10

Trước hết, tôi tra cứu câu hỏi liên quan này trong here nhưng giải pháp dataGridView1.Rows.Add() không hoạt động trong trường hợp của tôi.Hàng không thể được thêm theo chương trình vào bộ sưu tập hàng của datagridview khi điều khiển bị ràng buộc dữ liệu

Trong Datagridview của tôi, tôi có 3 hộp văn bản cho dữ liệu đầu vào và 2 ComboBoxes cho người dùng để chọn các giá trị (được ràng buộc vào cơ sở dữ liệu). Một trong những TextBox của tôi được thiết lập để chỉ đọc để người dùng chỉ có thể điền nó bên ngoài DataGrid (với một TexBox bình thường và một Button).

Khi người dùng điền vào một DataGridView với dữ liệu, luôn có hàng trống ở dưới cùng; vì vậy tôi vô hiệu hóa này và tôi đã sử dụng mã này để ngăn chặn người sử dụng từ việc thêm một hàng mới bên trong DataGrid ...

dataGridView1.AllowUserToAddRows = false 

Tôi chỉ muốn thêm một hàng mới khi người dùng nhấp vào nút tôi đã đề cập ở trên (mà ném một lỗi).

Thông báo lỗi tôi nhận được:

"Hàng không thể được lập trình thêm vào bộ sưu tập hàng của datagridview khi điều khiển là dữ liệu ràng buộc"

sample image một với một mũi tên màu đỏ là một ComboBox, và một với mũi tên màu xanh lá cây là một chỉ đọc TextBox

+5

Thêm một hàng để DataSource – sq33G

+0

Bạn đang sử dụng tài sản .DataSource? –

Trả lời

20

Dường như bạn đang sử dụng thuộc tính DataSource của DataGridView. Khi thuộc tính này được sử dụng để liên kết với dữ liệu, bạn không thể thêm hàng trực tiếp vào DataGridView một cách rõ ràng. Thay vào đó, bạn phải thêm hàng trực tiếp vào nguồn dữ liệu của mình.

Ví dụ, nếu nguồn dữ liệu của bạn là một DataTable, sử dụng DataTable được gán cho thuộc tính DataSource (chưa được kiểm tra):

private void AddARow(DataTable table) 
{ 
    // Use the NewRow method to create a DataRow with 
    // the table's schema. 
    DataRow newRow = table.NewRow(); 

    // Add the row to the rows collection. 
    table.Rows.Add(newRow); 
} 
+2

Lưu ý rằng bạn cũng có thể thêm ở trên cùng: 'dt.Rows.InsertAt (hàng, 0);' – TaW

1

Sau khi thêm hàng mới, bạn phải đặt chỉ mục hàng trong ranh giới của số hàng. Bạn phải thực hiện các bước sau.

  1. Đầu tiên, thêm dòng trong DataGridView:

    dataGridView1.Rows.Add(); 
    
  2. Thứ hai, thiết lập chỉ số hàng mới để đếm - 1:

    int RowIndex = dataGridView1.RowCount - 1; 
    
  3. Rồi cuối cùng, thiết lập các giá trị điều khiển trong nó:

    DataGridViewRow R = dataGridView1.Rows[RowIndex]; 
    R.Cells["YourName"].Value = tbName.Text; 
    

Và nếu nguồn dữ liệu của bạn là datattable bạn phải thêm hàng trong bảng đó.Give giá trị mới vào hàng mới được thêm vào trong bảng dữ liệu và cuối cùng rebind dữ liệu với cập nhật datatable.

DataRow row = dt.NewRow(); 
    row["columnname"] = tbName.Text.toString(); 
    dt.Rows.Add(row); 
    dt.AcceptChanges(); 

    dataGridView1.DataSource = dt; 
    dataGridView1.DataBind(); 

Kiểm tra xem bạn đã đặt chỉ mục của hàng mới đúng chưa. Có lẽ đó là lý do tại sao bạn nhận được lỗi này.

+1

hi Syeda, bây giờ tôi đã thử phương pháp của bạn. trong chế độ gỡ lỗi, lỗi xảy ra khi nó bước vào bước đầu tiên, đó là 'dataGridView1.Rows.Add();' –

+1

i đã đưa ra các mẫu cho cả bảng gridview và bảng dữ liệu. Bạn đã thử mẫu cho GridView trong khi bạn đang sử dụng datatable. – Syeda

0

DataGridView ràng buộc có một vấn đề mà khi bạn muốn thêm dữ liệu của bạn lập trình nó ngăn nó thêm trực tiếp.vì vậy cách gián tiếp và tốt nhất để thêm dữ liệu là như thế này .. và nhớ không bao giờ thêm dữ liệu trực tiếp vào datagridview lập trình bởi vì nó tạo ra vấn đề luôn, thêm dữ liệu vào nguồn dữ liệu của bạn thay vì :-)

code for VB.NET 
Dim r As DataRow (C# : Datarow r=new Datarow() below codes apply to C# also) 
r = dataset.Tables(0).NewRow 
r.Item("field1") = "2" 
r.Item("field2") = "somevalue" 
dataset.Tables(0).Rows.Add(r) 

dataset.Tables(0).acceptchanges() 

the update will goes as you do ever 
0

Giải pháp tốt nhất mà tôi tìm thấy :

//create datatable and columns 
DataTable dtable = new DataTable(); 
dtable.Columns.Add(new DataColumn("Column 1")); 
dtable.Columns.Add(new DataColumn("Column 2")); 

//simple way create object for rowvalues here i have given only 2 add as per your requirement 
object[] RowValues = { "", "" }; 

//assign values into row object 
RowValues[0] = "your value 1"; 
RowValues[1] = "your value 2"; 

//create new data row 
DataRow dRow; 
dRow = dtable.Rows.Add(RowValues); 
dtable.AcceptChanges(); 

//now bind datatable to gridview... 
gridview.datasource=dtable; 
gridview.databind(); 

Nguồn: http://www.codeproject.com/Questions/615379/Adding-rows-to-datagridview-with-existing-columns

2

Bạn có thể lấy DataGridView 's DataSource và đúc nó như là một DataTable.

Sau đó, thêm DataRow mới và đặt giá trị của trường.

Thêm hàng mới vào số DataTable và Chấp nhận thay đổi.

Trong C# nó sẽ là một cái gì đó như thế này:

DataTable dataTable = (DataTable)dataGridView.DataSource; 
DataRow drToAdd = dataTable.NewRow(); 

drToAdd["Field1"] = "Value1"; 
drToAdd["Field2"] = "Value2"; 

dataTable.Rows.Add(drToAdd); 
dataTable.AcceptChanges(); 
+0

Đây là giải pháp tốt nhất nếu bạn đã ràng buộc 'DataTable' vào' DataGridView' trong phương thức khác và ' DataTable' không phải là biến công khai. Nice suy nghĩ! –

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