2010-05-12 28 views
5

Tôi có một DataGridView được ràng buộc với một DataTable, nó có một cột đó là một đôi và các giá trị cần phải được giữa 0 và 1. Đây là mã của tôiDataGridView xác nhận giá trị cũ insted của giá trị mới

private void dgvImpRDP_InfinityRDPLogin_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) 
{ 
    if (e.ColumnIndex == dtxtPercentageOfUsersAllowed.Index) 
    { 
     double percentage; 
     if(dgvImpRDP_InfinityRDPLogin[e.ColumnIndex, e.RowIndex].Value.GetType() == typeof(double)) 
      percentage = (double)dgvImpRDP_InfinityRDPLogin[e.ColumnIndex, e.RowIndex].Value; 
     else if (!double.TryParse(dgvImpRDP_InfinityRDPLogin[e.ColumnIndex, e.RowIndex].Value.ToString(), out percentage)) 
     { 
      e.Cancel = true; 
      dgvImpRDP_InfinityRDPLogin[e.ColumnIndex, e.RowIndex].ErrorText = "The value must be between 0 and 1"; 
      return; 
     } 
     if (percentage < 0 || percentage > 1) 
     { 
      e.Cancel = true; 
      dgvImpRDP_InfinityRDPLogin[e.ColumnIndex, e.RowIndex].ErrorText = "The value must be between 0 and 1"; 
     } 
    } 
} 

Tuy nhiên, vấn đề của tôi khi dgvImpRDP_InfinityRDPLogin_CellValidating cháy dgvImpRDP_InfinityRDPLogin[e.ColumnIndex, e.RowIndex].Value sẽ chứa giá trị cũ trước khi chỉnh sửa, không phải giá trị mới.

Ví dụ cho phép nói rằng giá trị cũ là 0,1 và tôi nhập 3. Đoạn mã trên chạy khi bạn thoát khỏi tế bào và dgvImpRDP_InfinityRDPLogin[e.ColumnIndex, e.RowIndex].Value sẽ .1 cho chạy đó, mã xác nhận và ghi dữ liệu vào DataTable.

Tôi nhấp vào nó lần thứ hai, cố gắng thoát và lần này nó hoạt động giống như nó sẽ làm tăng biểu tượng lỗi cho ô và ngăn tôi rời khỏi. Tôi cố nhập đúng giá trị (ví dụ .7) nhưng số Value vẫn sẽ là 3 và hiện không có cách nào thoát khỏi ô vì nó bị khóa do lỗi và mã xác nhận của tôi sẽ không bao giờ đẩy giá trị mới.

Mọi đề xuất sẽ được đánh giá cao.

EDIT - Phiên bản mới của mã dựa trên đề xuất của Stuart và bắt chước kiểu mà bài viết MSDN sử dụng. Vẫn cư xử như vậy.

private void dgvImpRDP_InfinityRDPLogin_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) 
{ 
    if (e.ColumnIndex == dtxtPercentageOfUsersAllowed.Index) 
    { 
     dgvImpRDP_InfinityRDPLogin[e.ColumnIndex, e.RowIndex].ErrorText = String.Empty; 
     double percentage; 
     if (!double.TryParse(dgvImpRDP_InfinityRDPLogin[e.ColumnIndex, e.RowIndex].FormattedValue.ToString(), out percentage) || percentage < 0 || percentage > 1) 
     { 
      e.Cancel = true; 
      dgvImpRDP_InfinityRDPLogin[e.ColumnIndex, e.RowIndex].ErrorText = "The value must be between 0 and 1"; 
      return; 
     } 
    } 
} 

Trả lời

4

Bạn cần phải sử dụng tài sản FormattedValue của DataGridViewCellValidatingEventArgs dụ thay vì giá trị di động, như giá trị tế bào không được cập nhật cho đến khi xác nhận đã thành công:

Các văn bản nhập vào bởi người sử dụng thông qua giao diện người dùng (UI) trở thành giá trị thuộc tính Giá trị thuộc tính FormattedValue. Đây là giá trị mà bạn có thể xác thực trước nó được phân tích cú pháp vào giá trị thuộc tính Value . (MSDN)

+0

Nope, 'dgvImpRDP_InfinityRDPLogin [e.ColumnIndex, e.RowIndex] .FormattedValue' =" .1" sau khi tôi đã nhập 5 –

+1

Nope. Bạn cần xem e.FormattedValue! – stuartd

+0

Ah! cảm ơn tôi thậm chí không nhận thấy giá trị được định dạng bên trong e. –

1

Làm thế nào để làm điều gì đó như thế này? Điều này giả định bạn đang sử dụng hộp văn bản trong datagridview của bạn, vì vậy nếu bạn đang sử dụng một số điều khiển khác, chỉ cần thay đổi nó để điều đó. (Mặc dù tôi không chắc tại sao Stuart Dunkeld trả lời không hoạt động, FormattedValue sẽ có giá trị mới trong đó).

void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) 
    { 
    if (e.ColumnIndex == 0) // dtxtPercentageOfUsersAllowed.Index 
    { 
     object should_be_new_value = e.FormattedValue; 
     double percentage; 
     if (dgvImpRDP_InfinityRDPLogin.EditingControl != null) 
     { 
      string text = dgvImpRDP_InfinityRDPLogin.EditingControl.Text; 
      if (!double.TryParse(text, out percentage)) 
      { 
       e.Cancel = true; 
       dgvImpRDP_InfinityRDPLogin[e.ColumnIndex, e.RowIndex].ErrorText = "The value must be between 0 and 1"; 
       return; 
      } 
      if (percentage < 0 || percentage > 1) 
      { 
       e.Cancel = true; 
       dgvImpRDP_InfinityRDPLogin[e.ColumnIndex, e.RowIndex].ErrorText = "The value must be between 0 and 1"; 
      } 
      else 
      { 
       dgvImpRDP_InfinityRDPLogin[e.ColumnIndex, e.RowIndex].ErrorText = null; 
      } 
     } 
    } 
    } 
+0

Điều đó đã hiệu quả. cảm ơn. –

+0

Không sao cả. Tôi chỉ thay đổi một chút để sử dụng văn bản và không kiểm tra loại. Nên cung cấp cho cùng một kết quả chỉ có một chút sạch hơn, nhưng hãy cho tôi biết nếu nó không hoạt động và Ill trở lại bài viết trở lại. – SwDevMan81

+0

Nó không thành công vì EditingControll có thể rỗng nếu bạn đang xác thực và không có hộp nào hiện đang được chỉnh sửa. –

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