抱歉标题质量差。我想不出更好的表达方式。
对于我目前正在与几个朋友合作的项目,我让自己处于创建动态表单(带有反射)的情况,我现在想要验证它。
示例(忽略黑框,它包含现在无关紧要的旧表单元素,我不想让你们混淆):
您可能已经猜到了,它是一个用于创建 mysql 数据库的应用程序。这是我解决问题的地方。如果选中其他复选框,我想禁用复选框。
例如:如果我选中“PrimaryKey”,我想禁用复选框“Null”。从无符号更改为有符号会更改 numericupdown 最小值和最大值等。
但是通过反射等等,我发现很难确切知道要禁用哪个复选框。希望大家给点建议。
我一直在考虑这个问题,并想到了一些想法。也许这些是比当前更好的解决方案。
想法 1:我为每种数据类型创建用户控件。Pro's:反射没有问题,并且可以轻松识别 UserControl 中的每个控件以进行验证。缺点:复制粘贴,大量用户控件,有很多相同的控件。
想法 2:使用类的每个属性的描述标签做一些事情。在描述中创建允许我将复选框链接在一起的规则。在这里,我只需要将规则复制到每个类属性,然后就可以了。
我一直在考虑其他解决方案,但我没有记住它们。我希望你们能给我一些好的指点/建议。
[编辑] 也许我的代码可以解释更多。我的代码:
PropertyInfo[] properties = DataTypes.DataTypes.GetTypeFromString(modelElement.DataType.ToString()).GetType().GetProperties();
foreach (PropertyInfo prop in properties)
{
if (prop.Name != "Label" && prop.Name != "Project" && prop.Name != "Panel")
{
var value = prop.GetValue(modelElement.DataType, null);
if (value != null)
{
tableLayoutPanel1.Controls.Add(new Label { Text = prop.Name, Anchor = AnchorStyles.Left, AutoSize = true });
switch (value.GetType().ToString())
{
case "System.Int32":
NumericUpDown numericUpDown = new NumericUpDown();
numericUpDown.Text = value.ToString();
numericUpDown.Dock = DockStyle.None;
tableLayoutPanel1.Controls.Add(numericUpDown);
break;
case "System.Boolean":
CheckBox checkBox = new CheckBox();
checkBox.Dock = DockStyle.None;
// checkbox will become huge if not for these changes
checkBox.AutoSize = false;
checkBox.Size = new Size(16, 16);
if (value.Equals(true))
{
checkBox.CheckState = CheckState.Checked;
}
tableLayoutPanel1.Controls.Add(checkBox);
break;
default:
MessageBox.Show(@"The following type has not been implemented yet: " + value.GetType());
break;
}
}
}
}