将不同的控件作为参数发送给方法



我使用相同的表单输入新数据和输入现有记录,例如供应商、库存项目、客户等。在Edit模式下,我将所有文本框设置为Read-Only,一旦用户选择了要编辑的记录,我将只读状态重置为false。一个表单可能包含几个选项卡(或Telerik中的PageViewPages),每个选项卡都包含一些可编辑的控件,这些控件必须设置为只读true/false。

我使用这段代码将容器数组发送给一个名为FormControl的类。

RadGroupBox [] containerList = { this.pageGeneral, this.pageBankDetail, this.pageContact };
FormControl.ControlsReadOnly(containerList, false);  // /truefalse to set Read-only status
在FormControl类中,我有以下代码来设置只读状态。
public static void ControlsReadOnly(RadGroupBox [] containerList, bool readOnlyStatus)
    {
       var container = (containerList[0] as RadGroupBox);
        for (int i = 0; i < containerList.Length; i++)
        {
            foreach (var control in container.Controls)
            {
                RadTextBox textEdit = control as RadTextBox;
                if (textEdit != null)
                {
                    textEdit.ReadOnly = readOnlyStatus;
                    continue;
                }
                RadMaskedEditBox textMasked = control as RadMaskedEditBox;
                if (textMasked != null)
                {
                    textMasked.ReadOnly = readOnlyStatus;
                    continue;
                }
                // rest of the code

代码工作得很好,但是明显的缺点是它只有在容器是RadGroupBox时才能工作。我想使用相同的代码来处理表单,组框和PageViews通过改变控件类型在调用表单。

我怀疑答案将涉及反射,但我不能解决它。我已经尝试将FormControl方法中的参数列表替换为Control [] containerList,但是我不能再使用var变量了。

我不熟悉RadBox (Telerik的东西?),但爬上继承链,找到最低的公共类-也就是说,你想要操作的所有控件继承自相同的基类?

ReadOnly属性定义在哪里?如果它只存在于RadBox上,那么您可能就不那么幸运了。然而,如果它存在于RadBox继承的东西上,那么您所要做的就是将您的方法定义为接受这些类型的集合。

例如,如果有一个具有只读属性的BaseControl类,并且RadBox从那里继承,只需传递"BaseControl [] ContainerList"。最后,你总是可以传递一个对象作为它的基类型。

这是你要找的吗?

@ChrisC是正确的,RadGroupBox继承自控件类,并且控件类有一个属性Controls

public static void ControlsReadOnly(Control[] containerList, bool readOnlyStatus)
{
}

有一件事我不明白:为什么你看同样的控制次数作为你的数组的长度?你的意思是:

public static void ControlsReadOnly(Control[] containerList, bool readOnlyStatus)
{

    for (int i = 0; i < containerList.Length; i++)
    {
          var control = containerList[i];
          //... omitted code for brevity 
    }
}

最后,我不知道这是否有帮助,但任何控制都可以是Enabled。这可能有助于保持访问的一致性,这样您就可以做这样的事情:

public static void ControlsReadOnly(Control[] containerList, bool readOnlyStatus)
{
     foreach (var control in container.Controls)
     {
          foreach (var control in container.Controls)
          {
              if((control as RadTextBox) != null)
              {
                 control.Enabled = !readOnlyStatus; 
              }
          }
     }
}

我希望这对你有帮助!

来源:

http://www.telerik.com/help/winforms/t_telerik_wincontrols_ui_radgroupbox.htmlhttp://msdn.microsoft.com/en-us/library/system.windows.forms.control.aspx

我是这样实现的,而且效果很好。

 public static void ControlsReadOnly(Control [] containerList, bool readOnlyStatus)
    {
        for (int i = 0; i < containerList.Length; i++)
        {
            foreach (var control in containerList[i].Controls)
            {
                // ignore labels
                if ((control as RadLabel) != null)  
                {
                    continue;
                }
                // other editable controls
                else if ((control as RadTextBox) != null)
                {
                    (control as RadTextBox).ReadOnly = readOnlyStatus;
                    continue;
                }
                else if ((control as RadMaskedEditBox) != null)
                {
                    (control as RadMaskedEditBox).ReadOnly = readOnlyStatus;
                    continue;
                }
                // rest of code

谢谢你的帮助!

相关内容

  • 没有找到相关文章

最新更新