2009-06-08 45 views
8

Tôi đang sử dụng DataGridView Control để đọc và viết một tệp XML thông qua XML Serialization.DataGridView -Giá trị không được lưu nếu lựa chọn không bị mất từ ​​một ô

Tôi gặp sự cố như được giải thích dưới đây:

  1. Tôi đọc một tập tin XML và cư khiển DataGridView với đối tượng deserialized.
  2. Tôi cập nhật tất cả các giá trị trên DataGridView trên ô.
  3. Tôi chọn tùy chọn Lưu tệp dưới dạng mà không làm mất tập trung vào ô cuối cùng.

Sau này, giá trị của ô cụ thể không được cập nhật. Nếu tôi cố ý dịch chuyển tiêu điểm (nói rằng tôi nhấp vào một ô khác trên cùng một lưới) giá trị được cập nhật.

Có ai có thể đề xuất bất kỳ giải pháp nào cho vấn đề này không?

Trả lời

4

Nếu tôi hiểu chính xác bạn, ô đang ở chế độ chỉnh sửa và bạn đang cố gắng dừng lập trình chỉnh sửa và chuyển giá trị cho nguồn dữ liệu cơ bản?

Tôi đang sử dụng một cách tiếp cận hơi "bẩn" để làm điều đó trong một trong những ứng dụng của tôi:

if (dataGridView1.CurrentCell.IsInEditMode)  
{  
    int y = dataGridView1.CurrentCellAddress.Y;  
    int x = dataGridView1.CurrentCellAddress.X;  
    if (y > 0)  
     dataGridView1.CurrentCell = dataGridView1.Rows[y - 1].Cells[x];  
    else  
     dataGridView1.CurrentCell = dataGridView1.Rows[y + 1].Cells[x];  
    dataGridView1.CurrentCell = dataGridView1.Rows[y].Cells[x];  
} 

Đó đoạn mã kiểm tra đầu tiên cho dù các tế bào hiện nay là trong chế độ chỉnh sửa. Sau đó, nó thay đổi ô hiện tại theo chương trình (hoặc là hàng trước đó hoặc hàng kế tiếp trong trường hợp chúng ta đang ở hàng đầu tiên). Sau đó, nó khôi phục vùng chọn hiện tại của ô.

Bạn sẽ gọi mã này trong trình xử lý "Lưu dưới dạng tệp" của bạn.

+0

Cảm ơn giải pháp. –

+0

Vui vì tôi có thể giúp. Bạn có thể đánh dấu đây là giải pháp được chấp nhận của bạn không? –

15

Đó là vì giá trị ô đã chỉnh sửa không được cam kết với DataSource cho đến khi được xác thực, điều này xảy ra khi ô bị mất tiêu điểm. Nếu bạn muốn cam kết sửa đổi ngay lập tức, bạn có thể xử lý các sự kiện CurrentCellDirtyStateChanged, và gọi phương thức CommitEdit trong xử lý:

void dataGridView1_CurrentCellDirtyStateChanged(object sender, 
    EventArgs e) 
{ 
    if (dataGridView1.IsCurrentCellDirty) 
    { 
     dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit); 
    } 
} 
+1

Điều này làm việc awesomely, cảm ơn! –

+2

Điều này hoạt động hoàn hảo trong phương pháp lưu của tôi. Cảm ơn!! –

+0

Điều này cũng làm việc rất tốt với tôi. Cảm ơn – Abdullah

0

Bạn có thể nhận được giá trị của một tế bào mà vẫn chưa được cam kết sử dụng tài sản EditedFormattedValue cho ô hiện tại, như sau

dataGridView1.CurrentCell.EditedFormattedValue 
16

cách tốt nhất (mặc dù nhanh chóng và bẩn) là gán giá trị currentCell để Nothing.

Ví dụ, trong các phương pháp tiết kiệm, làm:

dgvMyGrid.CurrentCell = Nothing 

và sau đó tiến xa hơn.

+0

Tôi có cùng một tình huống và giải pháp của bạn hoạt động hoàn hảo. Tôi vẫn tự hỏi làm thế nào điều này là có thể. – JPReddy

0

Tôi đã có tình huống tương tự và tôi thậm chí còn sử dụng các phím tăng tốc cho nút lưu để lưu các giá trị lưới. Khi tôi bấm vào nút Lưu tập trung bị mất từ ​​DGV và do đó giá trị ô được cam kết, nhưng khi tôi sử dụng phím gia tốc tập trung không bị mất từ ​​DGV do đó không cam kết giá trị của ô.

Sau khi nhìn vào câu trả lời của Amit Karmakar vì tò mò, tôi đã thử câu trả lời và nó đã hoạt động. Để tìm hiểu thêm chi tiết tôi đã đi vào gỡ lỗi của DGV và thấy rằng nó thực sự giống như cam kết mà bằng cách nào đó không hoạt động nếu bạn sử dụng nó trong nút bấm lưu.

Khi chúng tôi đặt CurrentCell của DGV thành null, trước khi đặt nó thành giá trị null DGV đầu tiên nhận giá trị được chỉnh sửa và đẩy nó vào giá trị ô và sau đó đặt CurrentCell REFERENCE thành null. Ở đây nó không có nghĩa là nó đang thiết lập ô DGV bên dưới thành null. Do đó điều này làm việc hoàn hảo cho vấn đề trên.

Lưu ý: Giải pháp này có thể không hoạt động hoàn hảo khi bạn xác thực sự kiện cho ô và nếu người dùng nhập dữ liệu không hợp lệ sẽ không xác thực được. Trong trường hợp này, thiết lập ô hiện tại thành null cũng không thành công vì nó không thể đẩy giá trị vào ô.

Tôi đã đưa ra giải thích này khi tôi đặt câu hỏi về câu trả lời của Amit Karmakar hỏi làm thế nào nó có thể thực hiện được. Tôi nghĩ rằng nó có thể giúp đỡ một số khác, vì vậy bỏ giải thích này như là câu trả lời.

0

OK, đây là xấu xí nhưng nó hoạt động để có được những thay đổi cuối cùng từ lưới điện mà không cần phải chuyển sang hàng khác:

With DataGridView1 
    .DataSource = Nothing 
    .DataSource = gridDataTable 
    Dim changedFoo As DataTable = gridDataTable.GetChanges 
End With 

Tuy nhiên tôi vẫn thích câu trả lời từ Amit Karmakar là tốt nhất. Tôi đã thêm 'DataGridView1.CurrentCell = Nothing' vào sự kiện LostGocus DataGridView1.

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