我使用相同的表格输入新数据并输入现有记录,例如对于供应商,库存商品,客户等。在编辑模式下,我将所有文本框设置为只读,一旦用户选择了要编辑的记录,我将只读状态重置为false。表单可能包含多个选项卡(或Telerik中的PageViewPages),每个选项卡都包含许多可编辑的控件,这些控件必须设置为只读为真/假。
我使用此代码将容器数组发送到名为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时才有效。我想通过更改调用表单中的控件类型来使用相同的代码来处理表单,组框和PageView。
我怀疑答案会涉及反思,但我无法解决。我已经尝试将FormControl方法中的参数列表替换为Control [] containerList,但是我不能再使用var变量了。
答案 0 :(得分:1)
我不熟悉RadBox(Telerik的东西?)但是爬上继承链来找到最低的公共类 - 也就是说,你想要操作的所有控件都是从同一个基类继承的吗?
ReadOnly属性定义在哪里?如果它只存在于RadBox上,那么你可能会失败。但是,如果它存在于RadBox继承的东西上,那么您所要做的就是将方法定义为接受这些类型的集合。
例如,如果有一个BaseControl类,其上有Readonly属性,并且从那里继承了RadBox,只需传入“BaseControl [] ContainerList”。最终,您始终可以传递对象作为其基本类型。
这是你想要的吗?
答案 1 :(得分:0)
@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
}
}
最后,我不知道这是否有帮助,但任何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
答案 2 :(得分: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
感谢您的帮助!