我正在使用DataGrid(而不是DataGridView),并且我想隐藏RowHeader。问题是我将属性RowHeaderVisible设置为false后,DataGridBoolColumn出现了可视错误。 This是正常状态,然后将Checkbox从屏幕上移到左边并向后移动,就像this。将RowHeaderWidth设置为0只会使RowHeader更小但不可见。如何没有RowHeader且没有此视觉错误?
这是我用来填充DataGrid的代码:
VB:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles
MyBase.Load
DataGrid1.TableStyles.Add(New DataGridTableStyle)
Dim abc As New DataTable
abc.Columns.Add("a")
abc.Columns.Add("b")
abc.Columns.Add("c")
abc.Columns.Add("Bool", GetType(Boolean))
abc.Columns.Add("d")
abc.Columns.Add("e")
abc.Columns.Add("f", GetType(Boolean))
abc.Columns.Add("g")
abc.Columns.Add("h")
abc.Columns.Add("i")
abc.Columns.Add("j")
abc.Columns.Add("k")
abc.Columns.Add("l")
abc.Rows.Add({"t", "s", "sef", False, "se", "eff", False, "se", "eff", "efs", "se", "eff", "efs"})
abc.Rows.Add({"t", "s", "sef", False, "se", "eff", False, "se", "eff", "efs", "se", "eff", "efs"})
abc.Rows.Add({"t", "s", "sef", False, "se", "eff", False, "se", "eff", "efs", "se", "eff", "efs"})
abc.Rows.Add({"t", "s", "sef", False, "se", "eff", False, "se", "eff", "efs", "se", "eff", "efs"})
abc.Rows.Add({"t", "s", "sef", False, "se", "eff", False, "se", "eff", "efs", "se", "eff", "efs"})
abc.Rows.Add({"t", "s", "sef", False, "se", "eff", False, "se", "eff", "efs", "se", "eff", "efs"})
For Each tmpColumn As DataColumn In abc.Columns
Dim oSpalte As DataGridColumnStyle
If tmpColumn.DataType = GetType(Boolean) Then
oSpalte = New DataGridBoolColumn
Else
oSpalte = New DataGridTextBoxColumn
End If
oSpalte.ReadOnly = True
oSpalte.Width = 100
oSpalte.MappingName = tmpColumn.ColumnName
DataGrid1.TableStyles.Item(0).GridColumnStyles.Add(oSpalte)
DataGrid1.TableStyles.Item(0).MappingName = "Table"
Next
Me.DataGrid1.RowHeadersVisible = False
Me.DataGrid1.PreferredColumnWidth = 200
Me.DataGrid1.DataSource = abc
End Sub
C#
private void Form1_Load(object sender, EventArgs e)
{
DataGrid1.TableStyles.Add(new DataGridTableStyle());
DataTable abc = new DataTable();
abc.Columns.Add("a");
abc.Columns.Add("b");
abc.Columns.Add("c");
abc.Columns.Add("Bool", typeof(bool));
abc.Columns.Add("d");
abc.Columns.Add("e");
abc.Columns.Add("f", typeof(bool));
abc.Columns.Add("g");
abc.Columns.Add("h");
abc.Columns.Add("i");
abc.Columns.Add("j");
abc.Columns.Add("k");
abc.Columns.Add("l");
abc.Rows.Add(
{
"t",
"s",
"sef",
false,
"se",
"eff",
false,
"se",
"eff",
"efs",
"se",
"eff",
"efs"
});
abc.Rows.Add(
{
"t",
"s",
"sef",
false,
"se",
"eff",
false,
"se",
"eff",
"efs",
"se",
"eff",
"efs"
});
abc.Rows.Add(
{
"t",
"s",
"sef",
false,
"se",
"eff",
false,
"se",
"eff",
"efs",
"se",
"eff",
"efs"
});
abc.Rows.Add(
{
"t",
"s",
"sef",
false,
"se",
"eff",
false,
"se",
"eff",
"efs",
"se",
"eff",
"efs"
});
abc.Rows.Add(
{
"t",
"s",
"sef",
false,
"se",
"eff",
false,
"se",
"eff",
"efs",
"se",
"eff",
"efs"
});
abc.Rows.Add(
{
"t",
"s",
"sef",
false,
"se",
"eff",
false,
"se",
"eff",
"efs",
"se",
"eff",
"efs"
});
foreach (DataColumn tmpColumn in abc.Columns)
{
DataGridColumnStyle oSpalte;
if (tmpColumn.DataType == typeof(bool))
oSpalte = new DataGridBoolColumn();
else
oSpalte = new DataGridTextBoxColumn();
oSpalte.ReadOnly = true;
oSpalte.Width = 100;
oSpalte.MappingName = tmpColumn.ColumnName;
DataGrid1.TableStyles.Item(0).GridColumnStyles.Add(oSpalte);
DataGrid1.TableStyles.Item(0).MappingName = "Table";
}
this.DataGrid1.RowHeadersVisible = false;
this.DataGrid1.PreferredColumnWidth = 200;
this.DataGrid1.DataSource = abc;
}
答案 0 :(得分:0)
您是正确的,在DataGrid的DataGridBoolColumn绘图代码中确实存在一些错误,该错误在滚动过程中在屏幕上留下了人工痕迹。
无需深入研究源代码即可找到合适的解决方案,一个简单的技巧就是订阅DataGrid的scroll事件并使Invalidate控件使其重新绘制。
Private Sub DataGrid1_Scroll(sender As Object, e As EventArgs) Handles DataGrid1.Scroll
DataGrid1.Invalidate()
End Sub