0

我使用相同的表格输入新数据并输入现有记录,例如供应商、库存项目、客户等。在编辑模式下,我将所有文本框设置为只读,一旦用户选择了要编辑的记录,我将只读状态重置为 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 变量。

4

3 回答 3

1

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

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

例如,如果有一个带有 Readonly 属性的 BaseControl 类,并且 RadBox 从那里继承,则只需传入“BaseControl [] ContainerList”。最终,您始终可以将对象作为其基本类型传递。

这是你想要的?

于 2013-06-19T12:02:22.803 回答
0

@ChrisC 是正确的, RadGroupBox 继承自控件类,并且控件类具有 property 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 
    }

}

最后,我不知道这是否有帮助,但任何 Control 都可以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.html http://msdn.microsoft.com/en-us/library/system.windows.forms.control.aspx

于 2013-06-19T12:38:29.710 回答
0

这是我实现它的方法,效果很好。

 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

谢谢你的帮助!

于 2013-06-19T19:08:55.777 回答