0

タイトルの質が悪くてすみません。これを表現するより良い方法は思いつきませんでした。

私が現在数人の友人と取り組んでいるプロジェクトでは、検証したい動的フォーム (リフレクション付き) を作成した状況に陥りました。

例 (ブラック ボックスは無視してください。現在は関係のない古いフォーム要素が含まれており、皆さんを混乱させたくありません):

反射のあるダイナミックなフォルム

ご想像のとおり、これは 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;
                    }
                }
            }
        }
4

3 に答える 3

1

ここに私のコメントからのモックアップがあります:

// The ViewModel is responsible for handling the actual visual layout of the form.
public class ViewModel {

    // Fire this when your ViewModel changes
    public event EventHandler WindowUpdated;

    public Boolean IsIsNullCheckBoxVisible { get; private set; }

    // This method would contain the actual logic for handling window changes.
    public void CalculateFormLayout() {

        Boolean someLogic = true;

        // If the logic is true, set the isNullCheckbox to true
        if (someLogic) {
            IsIsNullCheckBoxVisible = true;
        }

        // Inform the UI to update
        UpdateVisual();
    }

    // This fires the 'WindowUpdated' event.
    public void UpdateVisual() {
        if (WindowUpdated != null) {
            WindowUpdated(this, new EventArgs());
        }
    }

}

public class TheUI : Form {

    // Attach to the viewModel;
    ViewModel myViewModel = new ViewModel();
    CheckBox isNullCheckBox = new CheckBox();

    public TheUI() {
        this.myViewModel.WindowUpdated += myViewModel_WindowUpdated;
    }

    void myViewModel_WindowUpdated(object sender, EventArgs e) {
        // Update the view here.

        // Notie that all we do in the UI is to update the visual based on the
        // results from the ViewModel;
        this.isNullCheckBox.Visible = myViewModel.IsIsNullCheckBoxVisible;
    }

}

ここでの基本的な考え方は、UI の機能をできるだけ少なくすることです。その役割は更新することだけです。何を更新しますか?それはViewModelクラスが決めることです。クラスですべての更新ロジックを実行しViewModel、更新の計算が完了したら、イベントを呼び出しますUpdateVisual()。これにより、UI にそれ自体を表す必要があることが通知されます。イベントが発生するWindowUpdatedと、UI は によって設定された構成を表示することで応答しますViewModel

これを最初に設定するのは大変な作業のように思えるかもしれませんが、一度設定すると、今後は非常に多くの時間を節約できます。ご不明な点がございましたら、お知らせください。

于 2013-07-29T15:01:27.410 に答える
0

1 つのチェックボックスのイベントを関連付けて、もう 1 つのチェックボックスを無効にしてみてください。このようなもの:

private void primaryKeyBox_AfterCheck(object sender, EventArgs e)
{
    nullBox.Enabled = false;
}

これは非常に単純な例であり、少し変更する必要がありますが、あなたが求めていることはうまくいくはずです。また、チェックボックスがオフになっているイベントに追加する必要があります。チェックされているチェックボックスとチェックされていないチェックボックスに基づいて、特定のチェックボックスからのみデータを取得するロジックも必要です。

ドロップダウンに基づいて数値を変更するなど、他のすべてのことについても、イベントに基づいて変更します。

于 2013-07-29T14:43:33.400 に答える