我在winform上有30个文本框和其他控件,我希望有时在true / false上设置它们的属性(启用,可见)。我不会制作重复的代码。我是winforms的新手,我想知道这个问题的好方法是什么。 我想使用扩展程序提供程序,但我知道它是否合适。索里为我的英语。 :)
如果有人能给我一个代码示例,我将非常感激。
答案 0 :(得分:1)
IExtenderProvider不是一个合适的解决方案,它旨在为现有控件添加新属性。通用方法非常简单:使用Panel。将要禁用或隐藏的所有控件放在该面板中。并将面板的Visible或Enabled属性设置为false。这将自动禁用面板的所有子控件。当你隐藏面板时,它的孩子也会被隐藏。
答案 1 :(得分:0)
这取决于您想要切换可见性和启用/禁用状态的情况 如果要更改状态,可以执行以下操作:
private void ToggleVisible(TextBox tb)
{
tb.Visible = !tb.Visible;
}
private void ToggleEnable(TextBox tb)
{
tb.Enabled= !tb.Enabled;
}
此外,如果您想同时更新多个文本框的状态,最好定义一个方法并对某些组进行批量更新。
真正重要的是正确分类(分组)您的文本框。 (如果可以的话,进入小组)
答案 2 :(得分:0)
以下是我做过这样的事情:
在我的表单继承的基本表单类中(反过来,继承自Form)....
#region Form Fields Enablers
protected virtual void EnableFormFields(Control ctl)
{
EnableFormFields(ctl, true);
}
protected virtual void DisableFormFields(Control ctl)
{
EnableFormFields(ctl, false);
}
protected virtual void EnableFormFields(Control ctl, bool enable)
{
EnableFormFields(ctl, enable, new string[0]);
}
protected virtual void EnableFormFields(Control ctl, bool enable, params string[] excludeControlName)
{
bool exclude = false;
foreach (string excludeCtl in excludeControlName)
{
if (string.Compare(ctl.Name, excludeCtl, true) == 0)
{
exclude = true;
break;
}
}
if (!exclude)
{
ctl.Enabled = enable;
foreach (Control childCtl in ctl.Controls)
{
EnableFormFields(childCtl, enable, excludeControlName);
}
}
}
#endregion Form Fields Enablers
然后,在特定的表单中,当我想设置给定容器中的所有控件时,我调用this.EnableFormFields(someContainerControl)
,例如所有选项卡上的所有控件(tabcontrol)或单个选项卡上的所有控件(tabpage) ,甚至表格上的所有控件(传递“this”)等等。我甚至可以通过将它们的名称作为字符串数组或每个这样的名称作为单独的尾随参数(方法定义中的“params”)来排除某些控件。参数列表)。
我认为这正是约翰所寻求的。新手的重要注意事项是此代码的递归,为给定控件设置Enable属性,然后调用该方法在每个控件的子控件中设置Enable属性。反过来,每个都在其子控件上设置属性。
谢谢, 约翰
答案 3 :(得分:0)
您可以考虑将文本框子类化并添加自己的属性:
class MyTextbox : Textbox {
public bool MyEnable {
get{ return someBool; }
set {
if (yourConditionIsMet) {
someBool = value;
this.Enabled = value;
}
}
}
}
...然后遍历表单中的所有控件:
foreach (Control control in this.Controls) {
if (control is MyTextbox)
control.MyEnable = true;
}