1

次の設計についてのガイダンスが必要です。

さまざまなグループ ボックスを含むタブ コントロールがあります。グループ ボックス内には、そのグループ ボックスに関連する特定のコントロールがあります。例えば:

ここに画像の説明を入力

グループ ボックス内の任意のコントロールに変更が加えられるたびに、コントロールの値を追跡する必要があります。これは、アプリケーションの実行サイクルの最後に、コントロール データをその値を含むファイルに保存する必要があるためです。ファイルの例は次のとおりです。

HOT_STANDBY_FEATURE_ENABLE [val from control here]

HEART_BEAT_DIGITAL_OUTPUT [val from control here] ....

私が考えている設計には、コントロールで ValueChanged イベントが発生するたびにグループ ボックス フォームが設​​定するプロパティだけを持つ別の設計があります。

コード例:

class ConfigurationValues
{
    public int HotStandbyValue { get; set; }
    public int HeartBeatDigitalOutputValue { get; set; }
    //...add all other controls here
}

これの欠点は、そのタブ ページに 40 個のコントロールがあるため、各プロパティを手動で入力する必要があることです。アプリケーションの実行サイクルの最後にファイルを生成する必要がある場合、必要なコントロールの値を取得するメソッドがあります。

例:

private void GenerateFile()
{
    string[] file = 
    "HOT_STANDBY_FEATURE_ENABLE "  + ConfigurationTabSettings.HotStandbyValue;
}

もう 1 つの設計上の考慮事項は、ユーザーが [構成ファイルを開く] をクリックするたびに、ディスクのファイルの値をプロパティにロードして、フォームが起動時にそのデータを取得し、グループ ボックス内のコントロールに入力できるようにすることです。それぞれの値で。

このデザインに関する提案は大歓迎です。これが最も効率的な方法ではなく、最も経験豊富なプログラマーではないこともわかっているので、検索できる Google キーワードはどれもすばらしいものです。

4

2 に答える 2

3

手動の「ファイルの生成」メソッドと「ファイルの読み取り」メソッドを作成する代わりに、ConfigurationValuesクラスをxmlシリアル化およびxml逆シリアル化できます。

http://support.microsoft.com/kb/815813

于 2012-06-26T15:47:36.320 に答える
2

コントロールのTextまたはValueプロパティをConfigurationValuesクラスのプロパティにバインドする必要があります。

ConfigurationValues cv = Repository.ReadConfigValues();

numPulseFilterDelay.DataBindings.Add("Value", cv, "PulseFilterDelay");

// Add the rest of your control bindings here

フォームのbtnSave_Click()で、フォームの現在の編集を終了し、構成値を保存します

void btnSave_Click(object sender, EventArgs e)
{
    BindingContext[cv].EndCurrentEdit(); // Commits all values to the underlying data source
    Repository.SaveConfigValues(cv);
}

リポジトリクラスには、データをLoad()およびSave()するためのメソッドが必要です。ここにXmlSerializationコードを配置するか、独自の形式を記述できます(要件に応じて)

public class Repository
{
  public static ConfigurationValues LoadConfigValues()
  {
     var cv = new ConfigurationValues();

     string[] lines = File.ReadAllLines("values.cfg");
     foreach (string cfg in lines)
     {
        string[] nameValue = cfg.Split(new char[] { ' ' } ); // To get label/value

        if (nameValue[0] == "HOT_STANDBY_FEATURE_ENABLE")
          cv.HotStandbyFeatureEnable = nameValue[1];
        else if (nameValue[0] == "SOME_OTHER_PROPERTY")
          cv.SomeOtherProperty = nameValue[2];
        // Continue for all properties
     }

     return cv;
  }


  public static void SaveConfigValues(ConfigurationValues cv)
  {
     var builder = new StringBuilder();
     builder.AppendFormat("HOST_STANDBY_FEATURE_ENABLE {0}\r\n", cv.HostStandbyFeatureEnable);
     // Add the rest of your properties

     File.WriteAllText("values.cfg", builder.ToString());
  }
}
于 2012-06-26T15:58:31.910 に答える