如何使DataGridView.Rows.DividerHeight工作?

时间:2015-05-21 14:53:24

标签: c# .net winforms datagridview

我尝试使用dataGridView创建一个简单的数独接口。问题是我无法让DividerHeight工作。下面的代码可以改变垂直分隔线的宽度,但不能改变水平分隔线:

   public partial class Form1 : Form
{
    private DataTable sudokuTable; 

    public Form1()
    {
        InitializeComponent();
        sudokuTable = getTable();
        dataGridView1.DataSource = sudokuTable;

        for (int i = 0; i < 9; i++){                        
            dataGridView1.Columns[i].Width = 25;
        }

        dataGridView1.Columns[2].DividerWidth = 5; //Working
        dataGridView1.Columns[5].DividerWidth = 5; //Working
        dataGridView1.Rows[2].DividerHeight = 5; //Not working
        dataGridView1.Rows[5].DividerHeight = 5; //Not working

    }


    private static DataTable getTable()
    {
        DataTable newDataTable = new DataTable();


        for (int i = 0; i < 9; i++)
        {
            newDataTable.Columns.Add("c" + i+1, typeof(int));                       
        }

        newDataTable.Rows.Add(1, 2, 3, 4, 5, 6, 7, 8, 9);
        newDataTable.Rows.Add(1, 2, 3, 4, 5, 6, 7, 8, 9);
        newDataTable.Rows.Add(1, 2, 3, 4, 5, 6, 7, 8, 9);
        newDataTable.Rows.Add(1, 2, 3, 4, 5, 6, 7, 8, 9);
        newDataTable.Rows.Add(1, 2, 3, 4, 5, 6, 7, 8, 9);
        newDataTable.Rows.Add(1, 2, 3, 4, 5, 6, 7, 8, 9);
        newDataTable.Rows.Add(1, 2, 3, 4, 5, 6, 7, 8, 9);
        newDataTable.Rows.Add(1, 2, 3, 4, 5, 6, 7, 8, 9);
        newDataTable.Rows.Add(1, 2, 3, 4, 5, 6, 7, 8, 9);

        return newDataTable;
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    } 
}

我是否需要更改某些属性才能使其正常工作?

我找到了一条建议未执行dividerHeight的链接:

http://www.visualwebgui.com/Developers/Forums/tabid/364/forumid/68/threadid/68506/scope/posts/Default.aspx

这是真的吗?

(我使用的是Visual Studio Community 2013和Net Framework 4.5)

2 个答案:

答案 0 :(得分:5)

您的代码运行正常。有一些额外的接触,它看起来像这样:

enter image description here

这基本上是你的代码,应用于刚刚删除到表单的普通DataGridView ..:

private void button1_Click_1(object sender, EventArgs e)
{
    dataGridView1.DataSource = null;
    dataGridView1.Rows.Clear();
    dataGridView1.Columns.Clear();

    sudokuTable = getTable();
    dataGridView1.DataSource = sudokuTable;

    for (int i = 0; i < 9; i++)
    {
        dataGridView1.Columns[i].Width = 25 + ((i+1)%3 == 0 ? 5:0);
    }

    dataGridView1.Columns[2].DividerWidth = 5;
    dataGridView1.Columns[5].DividerWidth = 5; 
    dataGridView1.Rows[2].DividerHeight = 5; 
    dataGridView1.Rows[5].DividerHeight = 5; 

    dataGridView1.Rows[2].Height += 5;
    dataGridView1.Rows[5].Height += 5; 

    dataGridView1.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;

    dataGridView1.RowHeadersVisible = false;
    dataGridView1.ColumnHeadersVisible = false;
    dataGridView1.AllowUserToAddRows = false;
    dataGridView1[0, 0].Selected = false;
}

getTable函数根本没有变化..

更新:我能够重现您的问题。我的DataGridView位于启动时未选中的TabPage上。通过调用按钮点击代码之前选择标签我看到了您的错误;当我在一行中选择Tab 第一时,它再次起作用..看起来像DGV的布局的问题/ 错误当它不是&#39时; t可见 ..

注意:在构造函数中调用它时,从不有效!那太早了。 Form_Load很好,但是..

作为临时解决方法,您可以将代码移至开始Button。 (无论如何,对于下一轮来说,有一个开始按钮可能是一个好主意..)

答案 1 :(得分:0)

免责声明:正如TaW发现的那样,当从表单构造函数移动到Form_Load时,OP代码可以正常工作。有关详细信息,请参阅his answer。我将此答案纯粹留作将来参考,并作为辅助选项。

我认为它与DataSource绑定有关。强调:我拿了你的代码(对我来说也没有用于行分隔符)并且决定测试别的东西 - 由于你的评论:

  

建议不执行dividerHeight

我测试了以下内容,确信它已实施:

dataGridView1.Columns[2].DefaultCellStyle.BackColor = Color.Red;
dataGridView1.Rows[2].DefaultCellStyle.BackColor = Color.Red;

该列已成功着色,但该行保持不变。这让我质疑它是否是绑定,因为我看到绑定在造型,可访问性等之前导致一些奇怪的问题。确实,将DataSource绑定到其他事物(如List的自定义行对象也失败了。

上述样式更改为行以及绑定“失败”,因为Form以及随后的DataGridView尚未显示。默认情况下,不会在幕后更改/处理可见性和绑定,直到之后构造函数运行它的过程。

因此,我采用了你的一般想法,TaW的想法是纠正宽度[和高度],并删除DataSource - 用DataGridView的手动填充代替它。以下结果用于完成您描述的所需输出:

private List<int> dividers = new List<int>() { 2, 5 };
private int pad = 5;

public Form1()
{
    InitializeComponent();
    InitializeDataGridView();
}

private void InitializeDataGridView()
{
    dataGridView1.AllowUserToAddRows = false;

    for (int i = 0; i < 9; i++)
    {
        DataGridViewTextBoxColumn column = new DataGridViewTextBoxColumn();
        column.HeaderText = "c" + (i + 1);
        column.Width = 25 + (dividers.Contains(i) ? pad : 0);
        dataGridView1.Columns.Add(column);
    }

    for (int i = 0; i < 9; i++)
    {
        DataGridViewRow row = new DataGridViewRow();
        row.CreateCells(dataGridView1);
        row.Height = row.Height + (dividers.Contains(i) ? pad : 0);
        dataGridView1.Rows.Add(row);

        foreach (DataGridViewCell cell in dataGridView1.Rows[i].Cells)
        {
            cell.Value = cell.ColumnIndex;
        }
    }

    foreach (int div in dividers)
    {
        dataGridView1.Columns[div].DividerWidth = pad;
        dataGridView1.Rows[div].DividerHeight = pad;
    }
}