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;
}
}
}
Nope, 'dgvImpRDP_InfinityRDPLogin [e.ColumnIndex, e.RowIndex] .FormattedValue' =" .1" sau khi tôi đã nhập 5 –
Nope. Bạn cần xem e.FormattedValue! – stuartd
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. –