我正在处理WinForm项目,并“尝试”创建一个TableLayoutPanel,用户可以在运行时调整其大小,例如SplitContainer的行为。我发现一些代码可以部分执行此操作,但是它是不完整的。有人可以帮我吗?
提前致谢,
-DA
到目前为止,这是我在CodeProject上找到的线程中提供的代码。我自己所做的唯一不同是创建了一个继承自TableLayoutPanel的customTableLayoutPanel。
public partial class Form1 : Form
{
bool resizing = false;
TableLayoutRowStyleCollection rowStyles;
TableLayoutColumnStyleCollection columnStyles;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
rowStyles = tableLayoutPanel1.RowStyles;
columnStyles = tableLayoutPanel1.ColumnStyles;
}
private void tableLayoutPanel1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
resizing = true;
}
}
private void tableLayoutPanel1_MouseMove(object sender, MouseEventArgs e)
{
if (resizing)
{
columnStyles[0].SizeType = SizeType.Absolute;
rowStyles[0].SizeType = SizeType.Absolute;
rowStyles[0].Height = e.Y;
columnStyles[0].Width = e.X;
}
}
private void tableLayoutPanel1_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
resizing = false;
}
}
}
最佳答案
将Column SizeType和Row SizeType属性设置为Absolute和CellBorderStyle,将其设置为所需的值,而不是在代码编写后将其设置为None
public partial class Form1 : Form
{
bool resizing = false;
TableLayoutRowStyleCollection rowStyles;
TableLayoutColumnStyleCollection columnStyles;
int colindex = -1;
int rowindex = -1;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
rowStyles = tableLayoutPanel1.RowStyles;
columnStyles = tableLayoutPanel1.ColumnStyles;
}
private void tableLayoutPanel1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
rowStyles = tableLayoutPanel1.RowStyles;
columnStyles = tableLayoutPanel1.ColumnStyles;
resizing = true;
}
}
private void tableLayoutPanel1_MouseMove(object sender, MouseEventArgs e)
{
if (!resizing)
{
float width = 0;
float height = 0;
//for rows
for (int i = 0; i < rowStyles.Count; i++)
{
height += rowStyles[i].Height;
if (e.Y > height - 3 && e.Y < height + 3)
{
rowindex = i;
tableLayoutPanel1.Cursor = Cursors.HSplit;
break;
}
else
{
rowindex = -1;
tableLayoutPanel1.Cursor = Cursors.Default;
}
}
//for columns
for (int i = 0; i < columnStyles.Count; i++)
{
width += columnStyles[i].Width;
if (e.X > width - 3 && e.X < width + 3)
{
colindex = i;
if (rowindex > -1)
tableLayoutPanel1.Cursor = Cursors.Cross;
else
tableLayoutPanel1.Cursor = Cursors.VSplit;
break;
}
else
{
colindex = -1;
if (rowindex == -1)
tableLayoutPanel1.Cursor = Cursors.Default;
}
}
}
if (resizing && (colindex>-1 || rowindex > -1))
{
float width = e.X;
float height = e.Y;
if (colindex > -1)
{
for (int i = 0; i < colindex; i++)
{
width -= columnStyles[i].Width;
}
columnStyles[colindex].SizeType = SizeType.Absolute;
columnStyles[colindex].Width = width;
}
if (rowindex > -1)
{
for (int i = 0; i < rowindex; i++)
{
height -= rowStyles[i].Height;
}
rowStyles[rowindex].SizeType = SizeType.Absolute;
rowStyles[rowindex].Height = height;
}
}
}
private void tableLayoutPanel1_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
resizing = false;
tableLayoutPanel1.Cursor = Cursors.Default;
}
}
}
关于c# - 用户在运行时调整TableLayoutPanel中行和列的大小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17178482/