我尝试使用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的链接:
这是真的吗?
(我使用的是Visual Studio Community 2013和Net Framework 4.5)
答案 0 :(得分:5)
您的代码运行正常。有一些额外的接触,它看起来像这样:
这基本上是你的代码,应用于刚刚删除到表单的普通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;
}
}