2010-02-03 62 views
6

Tôi có một khách hàng gặp vấn đề với một DataGridView trong một ứng dụng Windows. Họ đang gọi sự kiện CellValidated, nhưng họ muốn có xác nhận hợp lệ khác cho ô nếu nó nằm trong hàng đã được cam kết trở lại nguồn dữ liệu hơn là hàng đó được thêm lần đầu tiên (và chưa được cam kết (người dùng Tôi đã thử thuộc tính IsNewRow, nhưng ngay sau khi bạn bắt đầu nhập vào hàng, một "hàng mới" khác được thêm vào, do đó hàng bạn đang làm việc không còn được coi là hàng mới nữa. biết hàng chưa được cam kết vì bạn có thể nhấn Esc để hủy chỉnh sửa và toàn bộ hàng sẽ biến mất.C# DataGridView Thêm hàng - Khi xác thực, làm cách nào để biết hàng mới và chưa cam kết?

Có cách nào để biết liệu hàng hiện được chỉnh sửa có thực sự là "hàng mới" theo nghĩa nó chưa được cam kết trở lại nguồn dữ liệu?

+0

Xin lỗi - đây là lần đầu tiên của tôi với Stack Overflow. Tôi đã viết một câu trả lời, không thích nó, đã xóa nó, đã viết một câu trả lời tốt hơn, đã phải phục hồi nó. Dù sao, có nó dưới đây. Hy vọng nó giúp. – GenericMeatUnit

Trả lời

0

Câu trả lời của GenericMeatUnit không có tác dụng đối với tôi, nhưng nó cung cấp cho tôi đủ để tìm cách làm cho nó hoạt động. Đây là cách tôi đang làm việc kiểm tra tại:

if (this.DATASET.DATATABLE.Rows.Count == e.RowIndex) 

này câu lệnh if làm việc vì trước khi rời khỏi hàng trong DataGridView, nó không thực sự tồn tại trong DataTable, vì vậy số lượng hàng trong DataTable sẽ bằng RowIndex cho hàng mới, vì RowIndex là dựa trên 0.

3

Một cách tôi đã đạt được điều gì đó tương tự trong quá khứ là để sử dụng thuộc tính id của các đối tượng của tôi bị ràng buộc vào danh sách.

Ví dụ, nếu tôi có một BindingList<User> nơi người dùng là một cái gì đó như:

public class Names 
{ 
    public string Name { get; set; }   
    public int id { get; set; } 
} 

sau đó tôi có thể ràng buộc danh sách của tôi như thế này:

dataGridView1.AutoGenerateColumns = false; 
_users = new BindingList<User>(); 
_users .Add(new Names() { Name = "joe", id=1 }); 
_users .Add(new Names() { Name = "pete", id = 2 }); 

bindingSource1.DataSource = _names; 

DataGridViewTextBoxColumn col1 = new DataGridViewTextBoxColumn(); 
col1.DataPropertyName = "Name";   

dataGridView1.Columns.Add(col1); 

dataGridView1.DataSource = _users; 

Sau đó, khi DataGridView cung cấp một hàng mới , nó sẽ có một id là 0 (giá trị mặc định cho một số nguyên).

Mọi đối tượng đến từ cơ sở dữ liệu đều có id khác 0.

Cũng có thể có cách để đạt được điều này bằng cách sử dụng BindingSources nhưng tôi đã xem nhanh các thuộc tính ở đó và không có gì nhảy vọt vào tôi.

+0

Tôi thích câu trả lời này, và nó có vẻ như nó sẽ làm việc, nhưng kể từ khi tôi đang làm việc với một tập dữ liệu chung, không phải là một bộ sưu tập các đối tượng, tôi không thể xác minh nó hoàn toàn trong trường hợp này. Tôi đang bỏ phiếu cho nó vì nó có thể cung cấp hữu ích trong các tình huống khác nhau, chỉ cần không phải trong này không may. –

+0

Hàng ID-s từ cơ sở dữ liệu có thể là bất kỳ số nào, có thể là số âm, không hoặc dương - mã này phụ thuộc vào ý chí tốt của một DBA (http://msdn.microsoft.com/en-us/library/ms176057.aspx) – Vedran

3

Nguồn dữ liệu trong trường hợp này là gì?

Nếu đó là dữ liệu có thể định vị, bạn có thể dễ dàng kiểm tra thuộc tính DataRowState của các hàng có thể định giá để xem chúng có mới hay hiện tại không. Khi bạn đã xác thực các datarows của mình, bạn có thể gọi một Accept trên bảng để cam kết các hàng đó. Không cần phải can thiệp vào giữa lưới và nó có thể được đặt trong trường hợp này.

Tất nhiên, điều này không có nghĩa là dữ liệu của bạn thực sự được cam kết với cơ sở dữ liệu, nếu đó là nơi lưu trữ dữ liệu cuối cùng. Đó sẽ là một bước khác.

Ngoài ra, tôi thường tránh viết trực tiếp vào một chế độ xem dữ liệu; thay vào đó, tôi làm cho nó chỉ đọc và bật lên một màn hình thêm/nhập mà có thể thực hiện bất kỳ xác nhận yêu cầu.

Tôi không biết nếu bất kỳ điều này đã được sử dụng cho bạn - nếu tôi đã bỏ lỡ điểm xin vui lòng cho tôi biết.

+0

Điều này không hiệu quả vì khi một hàng được thêm vào và bạn chưa rời khỏi hàng, nó chưa tồn tại trong bảng dữ liệu. Cố gắng truy cập hàng tại RowIndex cho hàng sẽ ném một ngoại lệ. Tuy nhiên, điều này đã giúp tôi tìm cách để thực hiện công việc này - kiểm tra xem hàng có tồn tại trong tập dữ liệu hay không –

+0

Câu trả lời hay - chào mừng bạn đến với StackOverflow! –

0

Điều này sẽ giúp người mà không được sử dụng đối tượng DataTable:

Trong trường hợp CellBeginEdit thiết lập thuộc tính Tag với một số giá trị mà bạn sẽ sử dụng để phân biệt các 'mới' hàng

private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e) 
{ 
    if (e.RowIndex == dataGridView1.NewRowIndex) 
     dataGridView1.Rows[e.RowIndex].Tag = true; 
} 

Sau đó, trong sự kiện xác thực của mình, bạn có thể kiểm tra giá trị đó:

if (dataGridView1.Rows[e.RowIndex].Tag is bool 
    && (bool) dataGridView1.Rows[e.RowIndex].Tag) 
{ 
    // new row code 

    // after it's added, mark it as 'not new' 
    dataGridView1.Rows[e.RowIndex].Tag = false; 
} 
else 
{ 
    // existing row code 
} 
Các vấn đề liên quan