RowHeadersVisible = false时Datagrid中的Visual DataGridBoolColumn错误

时间:2019-09-06 11:09:10

标签: c# vb.net datagrid

我正在使用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;
}

1 个答案:

答案 0 :(得分:0)

您是正确的,在DataGrid的DataGridBoolColumn绘图代码中确实存在一些错误,该错误在滚动过程中在屏幕上留下了人工痕迹。

无需深入研究源代码即可找到合适的解决方案,一个简单的技巧就是订阅DataGrid的scroll事件并使Invalidate控件使其重新绘制。

Private Sub DataGrid1_Scroll(sender As Object, e As EventArgs) Handles DataGrid1.Scroll
  DataGrid1.Invalidate()
End Sub