C# 如何使DataGridView.Rows.DividerHeight工作?
我尝试使用dataGridView制作一个简单的数独界面。问题是我不能让切分灯工作。下面的代码可以更改垂直分隔符的宽度,但不能更改水平分隔符的宽度:C# 如何使DataGridView.Rows.DividerHeight工作?,c#,.net,winforms,datagridview,C#,.net,Winforms,Datagridview,我尝试使用dataGridView制作一个简单的数独界面。问题是我不能让切分灯工作。下面的代码可以更改垂直分隔符的宽度,但不能更改水平分隔符的宽度: public partial class Form1 : Form { private DataTable sudokuTable; public Form1() { InitializeComponent(); sudokuTable = getTable(); d
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)
{
}
}
公共部分类表单1:表单
{
私有数据表sudokuTable;
公共表格1()
{
初始化组件();
sudokuTable=getTable();
dataGridView1.DataSource=sudokuTable;
对于(int i=0;i<9;i++){
dataGridView1.Columns[i].Width=25;
}
dataGridView1.Columns[2]。DividerWidth=5;//正在工作
dataGridView1.Columns[5]。DividerWidth=5;//正在工作
dataGridView1.Rows[2]。DividerHeight=5;//不工作
dataGridView1.Rows[5]。DividerHeight=5;//不工作
}
私有静态数据表getTable()
{
DataTable newDataTable=新DataTable();
对于(int i=0;i<9;i++)
{
添加(“c”+i+1,typeof(int));
}
添加(1,2,3,4,5,6,7,8,9);
添加(1,2,3,4,5,6,7,8,9);
添加(1,2,3,4,5,6,7,8,9);
添加(1,2,3,4,5,6,7,8,9);
添加(1,2,3,4,5,6,7,8,9);
添加(1,2,3,4,5,6,7,8,9);
添加(1,2,3,4,5,6,7,8,9);
添加(1,2,3,4,5,6,7,8,9);
添加(1,2,3,4,5,6,7,8,9);
返回newDataTable;
}
私有void Form1\u加载(对象发送方、事件参数e)
{
}
}
是否有一些属性需要更改才能正常工作
我发现一个链接表明未实现dividerHeight:
dataGridView1.Columns[2].DefaultCellStyle.BackColor = Color.Red;
dataGridView1.Rows[2].DefaultCellStyle.BackColor = Color.Red;
这是真的吗
(我使用的是Visual Studio Community 2013和Net Framework 4.5)免责声明:正如TaW所发现的,当从表单构造函数移动到
表单加载时,OP代码工作正常。有关详细信息,请参阅。我留下这个答案纯粹是为了将来参考和作为第二选择
我相信这与数据源
绑定有关。强调一下:我接受了您的代码(对我来说,它在行分隔符上也不起作用),并决定测试其他东西-由于您的评论:
建议dividerHeight未实现
我对以下各项进行了测试,并确信其已实施:
dataGridView1.Columns[2].DefaultCellStyle.BackColor = Color.Red;
dataGridView1.Rows[2].DefaultCellStyle.BackColor = Color.Red;
列已成功着色,但行保持不变。这让我怀疑这是否是绑定,因为我以前见过绑定在样式、可访问性等方面导致了一些奇怪的问题。实际上,将数据源
绑定到其他东西(例如自定义行对象的列表
)也失败了
由于表单
,以及随后的DataGridView
,尚不可见,因此上述样式更改为行以及绑定“失败”。默认情况下,可见性和绑定不会在幕后更改/处理,直到构造函数运行它的过程
因此,我采纳了您的一般想法,即TaW关于纠正宽度[和高度]的想法,并删除了数据源
——将其替换为手动填充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;
}
}
private List dividers=new List(){2,5};
专用int pad=5;
公共表格1()
{
初始化组件();
初始化为TagRidView();
}
private void initializedTagRidView()
{
dataGridView1.AllowUserToAddress=false;
对于(int i=0;i<9;i++)
{
DataGridViewTextBoxColumn=新DataGridViewTextBoxColumn();
column.HeaderText=“c”+(i+1);
列宽=25+(分隔符包含(i)?填充:0);
dataGridView1.Columns.Add(column);
}
对于(int i=0;i<9;i++)
{
DataGridViewRow行=新建DataGridViewRow();
CreateCells(dataGridView1);
行高=行高+(分隔符包含(i)?填充:0);
dataGridView1.Rows.Add(row);
foreach(dataGridView1.Rows[i].Cells中的DataGridViewCell单元格)
{
cell.Value=cell.ColumnIndex;
}
}
foreach(整数除法器中的除法器)
{
dataGridView1.Columns[div].DividerWidth=pad;
dataGridView1.Rows[div].DividerHeight=pad;
}
}
您的代码工作正常。通过一些额外的接触,它看起来像这样:
这基本上是您的代码,应用于刚刚拖放到表单中的普通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;
}
private void按钮1\u单击1(对象发送者,事件参数e)
{
dataGridView1.DataSource=null;
dataGridView1.Rows.Clear();
dataGridView1.Columns.Clear();
sudokuTable=getTable();
dataGridView1.DataSource=sudokuTable;
对于(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.行[2].高度+=5;
dataGridView1.行[5]。高度+=5;
dataGridView1.DefaultCellStyle.Alignment=DataGridViewContentAlignment.MiddleCenter;
dataGridView1.RowHeadersVisible=false;
dataGridView1.ColumnHeadersVisible=false;
dataGridView1.AllowUserToAddress=false;
dataGridView1[0,0]。所选值=false;
}
对getTable
函数没有任何更改
更新:我能够重现您的问题。MyDataGridView
位于启动时未选中的选项卡页上。通过调用按钮,在选择选项卡之前单击“代码”,我看到了您的错误;当我输入一行以首先选择选项卡时