在WinForm中如何使用splitter控件?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在WinForm中如何使用splitter控件?相关的知识,希望对你有一定的参考价值。
1.将winform分为三列
整个窗体分成可以自动调节的三列的做法:
1、往窗体上丢两个panel控件
其中:
panelLeft——设置Dock属性为“left”,并调节好其宽度
panelRight——设置Dock属性为“right”,并调节好其宽度
2、往窗体上丢一个splitter控件名为splitterLeft,使其与panelLeft靠紧,设置其Dock属性为“left”
3、往窗体上丢一个splitter控件名为splitterRight,使其与panelRight靠紧,设置其Dock属性为“right”
4、往窗体上丢一个panel控件名为panelCenter,设置其Dock属性为“center”
运行就可以实现预期效果(注意:splitter控件只能作为窗体的Controls属性的子控件,而不能是某panel控件的子控件)
MinSize和MinExtra属性,限制分隔栏可以移动的距离。其区别是MinSize属性指定在分隔栏和分隔栏所在的容器边界之间最小距离(单位是像素)。MinExtra属性指定容器的对边和分隔栏之间的距离(单位是像素)。
2.将winform分为两列
新建一个窗体,按照下列顺序添加控件。
1、放入一个Panel比如:panel1 然后设置他的Dock属性为:Left;
2、放入一个Splitter比如:splitter1 设置它的背景颜色为一个特殊的颜色,便于看执行效果;
3、放入一个Panel比如:panel2 然后设置他的Dock属性为:Fill;
4、编译执行程序,这时候就没有问题了
3.将winform分为三列,并且中间那一列还需要分成上下两部分
首先重复上面的第一种方法,先分成三列
然后再中间的面板上,进行分成两行的操作
先丢一个groupbox,设置dock为bottom
然后拖一个splitter,设置dock为bottom
最后再拖一个datagridview,设置dock为fill
参考技术A 整个窗体分成可以自动调节的三列的做法:1、往窗体上丢两个panel控件其中:panelLeft设置Dock属性为left,并调节好其宽度panelRight设置Dock属性为right,并调节好其宽度2、往窗体上丢一个splitter控件名为splitterLeft,使其与panelLeft靠紧,设置其Dock属性为left3、往窗体上丢一个splitter控件名为splitterRight,使其与panelRight靠紧,设置其Dock属性为right4、往窗体上丢一个panel控件名为panelCenter,设置其Dock属性为center运行就可以实现预期效果(注意:splitter控件只能作为窗体的Controls属性的子控件,而不能是某panel控件的子控件)MinSize和MinExtra属性,限制分隔栏可以移动的距离。其区别是MinSize属性指定在分隔栏和分隔栏所在的容器边界之间最小距离(单位是像素)。MinExtra属性指定容器的对边和分隔栏之间的距离(单位是像素)。本回答被提问者采纳如何动态更改列表中控件的属性(C# Winform)?
【中文标题】如何动态更改列表中控件的属性(C# Winform)?【英文标题】:How do I change the properties of a control within a list dynamically (C# Winform)? 【发布时间】:2020-09-21 20:51:08 【问题描述】:我有一个复选框控件列表
public List<CheckBox> _checkBoxes = new List<CheckBox>();
我在运行时使用具有位置和可见性等属性的开关盒添加了一定数量。
这一切都很好,但如果我希望复选框消失或在某些时候被选中,则 GUI 不会更新,列表会用新数据更新,但不会在视觉上更新。
*我最终这样做了* 我在 winfrom 上创建了一堆复选框。创建了一个方法,您可以选择哪些是可见的。然后创建了一个方法来填充类型复选框列表。然后您可以在面板中搜索控件类型,一旦找到该控件,就可以对其进行操作。这并不优雅,可能不是最好的方法,但我是自定义控件和 winforms 的新手。
//search panel for checkboxes
foreach (Control c in panel1.Controls)
if (c is CustomControls.RoundedCheckBox)
CustomControls.RoundedCheckBox checkBox = c as CustomControls.RoundedCheckBox;
//if it is checked add to list
if(checkBox.Checked)
_checkBoxes.Add(checkBox);
【问题讨论】:
那你如何更新它们?我假设您尝试首先在表单控件集合中找到您的复选框,然后对其进行操作? 很可能列表中的项目与表单上的项目不同。我们需要查看更多代码来诊断此问题... 【参考方案1】:如果你有这样的事情:
_checkBoxes.Add(new CheckBox());
_checkBoxes[0].Parent = this;
那么您应该能够从列表中操作您的复选框:
_checkBoxes[0].Checked = false;
但是,如果您在某种循环中执行此操作并希望立即查看结果,则可能会出现问题。
在 Windows 中有一种叫做消息循环的东西。应用程序就是这样工作的(伪代码:TL;DR)
while(true)
message = GetFirstMessage();
if(message != null)
if(message.Id == CloseApplication)
break;
DispatchMessage(message);
RemoveFirstMessage();
因此,应用程序从队列中获取消息,然后对其进行处理。消息就是一切 - 按钮单击、鼠标移动、绘画……一切。
因此,当发送消息时,它会查找应接收此消息的控件,然后执行一些工作。
所以,例如,如果你有类似的东西:
foreach(var ch in _checkBoxes)
ch.Checked = false;
DoSomeWorkThatTakesTime();
ch.Checked = true;
您不会看到更改,因为您被“困”在 DispatchMessage 中。当您设置Checked
时,您确实发送了一条消息。但是现在无法调度此消息,因为您在 foreach 循环中。
因此,您在这里唯一能做的就是告诉您的应用程序 - 现在,请务必阅读消息队列。在 WinForms 中它被称为“DoEvents”,所以这将完成工作:
foreach(var ch in _checkBoxes)
ch.Checked = false;
Application.DoEvents();
DoSomeWorkThatTakesTime();
ch.Checked = true;
Application.DoEvents();
【讨论】:
“为什么我被否决了?”我的猜测......任何时候这个网站上的任何人看到DoEvents()
,他们都会立即投反对票并且在地球上的某个地方有一个婴儿死去。以上是关于在WinForm中如何使用splitter控件?的主要内容,如果未能解决你的问题,请参考以下文章