我在一个WinForm项目上工作,并且“尝试”创建一个TableLayoutPanel,用户可以在运行时像SplitContainer一样调整它的大小。我发现了一些代码,部分地做到了这一点,但是它是不完整的。有人能帮我吗?
先谢了-检察官
到目前为止,这是我在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;
}
}
}
5条答案
按热度按时间jk9hmnmh1#
将Column SizeType和Row SizeType属性设置为Absolute,并将CellBorderStyle设置为您想要的任何样式,而不是在代码编写过程中设置为None,如下所示
eqoofvh92#
我改进了MD的答案代码。
我不监听TableLayoutPanel的MouseEvents,而是监听控件的MouseEvents。下面是可调整行大小的代码:
frebpwbc3#
我的答案是使用鼠标只调整tablelayoutpanel的列大小,但可以很容易地更新行大小。当然,我更愿意为行使用拆分面板,但仍然如此。在代码中,我满足了4列的需要,但将其扩展到更多或更少是很容易的。cursurToDefault事件将被添加到tablelayoutpanel内的容器控件的mousemove事件中。
piztneat4#
根据原始代码编写模块
它使用一个字典和4个事件处理程序,使多个tablelayoutpanel可以调整行和列的大小。
有一些代码在那里捕捉移动的东西离开屏幕,但不多。
有关详细信息,请阅读代码中的注解
9w11ddsr5#
我稍微修改了一下,原始代码没有与边框对齐。2我还希望当应用程序加载时,列的大小默认为自动调整。3我使用了tableLayoutPanel1.GetRowHeights()和表格布局面板1.GetColumn宽度(),我从https://stackoverflow.com/a/51993386/13729116中找到了它,Jazimov解释说,这是对Intellisense隐藏的,因为它不应该与跨列的控件一起工作。我测试了这个,它确实有一个奇怪的地方,你可以在控件周围的填充区域移动被跨接控件隐藏的列。我相信如果你愿意,你可以解决这个问题。