Hành vi bạn đang thấy thực sự là do vấn đề sơn chứ không phải do biểu tượng lỗi không được hiển thị. Điều gì đang xảy ra là khi bạn đặt văn bản lỗi của ô, biểu tượng được hiển thị nhưng hộp văn bản của ô trong chế độ chỉnh sửa được vẽ lên biểu tượng, do đó không có biểu tượng nào được hiển thị cho người dùng!
Bạn có hai lựa chọn để sửa chữa này - một chỉ đơn giản là sử dụng văn bản lỗi của hàng nên thay vì:
this.datagridviewX.Rows[e.RowIndex].Cells[e.ColumnIndex].ErrorText = "Errortext";
e.Cancel = true;
Bạn có:
this.datagridviewX.Rows[e.RowIndex].ErrorText = "Errortext";
e.Cancel = true;
Các tùy chọn khác là thay đổi tế bào đệm của ô (di chuyển điều khiển chỉnh sửa) và vẽ biểu tượng.
Tôi thực sự tìm thấy kỹ thuật này để giải quyết sự cố here và tái tạo d mã của họ dưới đây (trong C# và không VB.Net).
Trước tiên, bạn phải di động của bạn xác nhận sự kiện, nơi bạn có thêm một số mã để thay đổi đệm tế bào:
void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
if (string.IsNullOrEmpty(e.FormattedValue.ToString()))
{
DataGridViewCell cell = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];
cell.ErrorText =
"Company Name must not be empty";
if (cell.Tag == null)
{
cell.Tag = cell.Style.Padding;
cell.Style.Padding = new Padding(0, 0, 18, 0);
}
e.Cancel = true;
}
else
{
dataGridView1.Rows[e.RowIndex].ErrorText = string.Empty;
}
}
đó cho phép vào biểu tượng để được nhìn thấy không phải là kiểm soát chỉnh sửa đã di chuyển, ngoại trừ các biểu tượng đã di chuyển quá! Vì vậy, chúng tôi cũng cần phải vẽ một biểu tượng mới.
void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
if (dataGridView1.IsCurrentCellDirty)
{
if (!string.IsNullOrEmpty(e.ErrorText))
{
GraphicsContainer container = e.Graphics.BeginContainer();
e.Graphics.TranslateTransform(18,0);
e.Paint(this.ClientRectangle, DataGridViewPaintParts.ErrorIcon);
e.Graphics.EndContainer(container);
e.Handled = true;
}
}
}
Sau đó, khi bạn kết thúc chỉnh sửa trên ô bạn cần phải thiết lập lại các padding:
void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
if (!string.IsNullOrEmpty(dataGridView1[e.ColumnIndex, e.RowIndex].ErrorText))
{
DataGridViewCell cell = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];
cell.ErrorText = string.Empty;
cell.Style.Padding = (Padding)cell.Tag;
cell.Tag = null;
}
}
Các bài nơi tôi tìm thấy này bỏ qua việc đặt chuột trên biểu tượng sơn mới - Dưới đây là một số mã thô giải quyết vấn đề đó, tôi không có thời gian để làm cho nó thực sự hoạt động, do đó có một số fudges nhẹ mà tư tưởng sẽ sửa chữa - Tôi sẽ dọn dẹp nó nếu tôi nhận được một phút sau đó.
Tôi đặt DataGridView.ShowCellToolTips = true và giới thiệu một boolean inError để theo dõi xem chúng tôi hiện có lỗi chỉnh sửa hay không. Sau đó, tôi xử lý sự kiện MouseHover:
void dataGridView1_MouseHover(object sender, EventArgs e)
{
if (inError)
{
Point pos = this.PointToClient(Cursor.Position);
if (r.Contains(pos.X - 20, pos.Y - 5))
{
t.Show("There was an error", dataGridView1.EditingControl, 3000);
}
}
}
Mã trong đó là cấp biểu mẫu Kiểm soát ToolTip và r là hình chữ nhật.
tôi cư r như sau trong xử lý bức tranh di động:
void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
if (dataGridView1.IsCurrentCellDirty)
{
if (!string.IsNullOrEmpty(e.ErrorText))
{
GraphicsContainer container = e.Graphics.BeginContainer();
r = dataGridView1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true);
e.Graphics.TranslateTransform(18, 0);
e.Paint(this.ClientRectangle, DataGridViewPaintParts.ErrorIcon);
e.Graphics.EndContainer(container);
e.Handled = true;
}
}
}
Tôi không hài lòng về trừ đi 20 và trừ 5 vào điểm vị trí - đó là những gì tôi muốn sửa chữa lên nếu tôi có thêm một chút thời gian.
Như tôi đã nói trong câu trả lời của tôi - những gì bạn đang mô tả không phải là ra khỏi hành vi hộp, do đó bạn phải làm điều gì đó không bình thường. Bạn có thể cung cấp một số mã? –