タイトルの質が悪くてすみません。これを表現するより良い方法は思いつきませんでした。
私が現在数人の友人と取り組んでいるプロジェクトでは、検証したい動的フォーム (リフレクション付き) を作成した状況に陥りました。
例 (ブラック ボックスは無視してください。現在は関係のない古いフォーム要素が含まれており、皆さんを混乱させたくありません):
ご想像のとおり、これは mysql データベースを作成するためのアプリケーションです。これが私の問題に到達する場所です。他のチェックボックスがチェックされている場合、チェックボックスを無効にしたい。
例: 「PrimaryKey」をチェックすると、チェックボックス「Null」を無効にします。unsigned から signed に変更すると、numericupdown の最小値と最大値などが変更されます。
しかし、リフレクションとすべてで、どのチェックボックスを無効にするかを正確に知るのは難しいと思います. 皆さんにいくつかの提案があることを願っていました。
私はしばらくこれについて考えてきましたが、いくつかの考えが頭に浮かびました。おそらく、これらは現在のものよりも優れたソリューションです。
考え 1: すべてのデータ型に対して UserControls を作成します。長所: リフレクションに問題はなく、検証のために UserControl 内のすべてのコントロールを簡単に識別できます。短所:同じコントロールがたくさんあるコピーペースト、たくさんのUserControls。
考え 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;
}
}
}
}