2011-02-01 3 views
0

winformsプログラムのさまざまな設定ファイルをさまざまな.settingsファイルに格納しています。これらの設定に含ま はSystem.Drawing.PointSystem.Drawing.LocationSystem.TimeSpanSystem.DateTime、等...TextBox.Text(WinForms)に非文字列をバインドするデータ

私は、フォームのLocationSystem.Drawing.Locationをバインドし、.Save()メソッドを呼び出すと、すべてが正常に動作するようです。つまり、キャストの必要がないように見えるので、フォームのSystem.Drawing.Locationは、.settingsファイルに格納されているSystem.Drawing.Locationの設定と直接互換性があります。 さらに、TimeSpan timeSpan = Settings.Duration;と言ってもうまくいきます。

ここでは、さまざまなパラメータを調整できる大きな設定フォームを作成しました。これには、さまざまなDateTimeTimeSpanの設定が含まれます。これらは、多くのTextBoxに表示し、編集可能です、私は次のようにバインドされたデータを持っている:私はそれを編集し、設定データソースにSave()を呼び出すしようとすると、

Settings DefaultSettings = Settings.Default; 
TextBox1.DataBindings.Add(("Text", DefaultSettings, "Duration", false, DataSourceUpdateMode.OnValidation, new TimeSpan(00, 30, 00)); 

TimeSpanは、しかし、TextBoxに見えます私は次のエラーを取得する:

Value of '0' is not valid for 'Value'. 'Value' should be between 'Minimum' and 'Maximum'. Parameter name: Value

エラーは、Visual Studioに由来するコードブロックを生成:

[global::System.Configuration.UserScopedSettingAttribute()] 
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 
[global::System.Configuration.DefaultSettingValueAttribute("00:30:00")] 
public global::System.TimeSpan StartWorkDay { 
    get { 
    return ((global::System.TimeSpan)(this["Duration"])); 
    } 
    set { 
    this["Duration"] = value; 
    } 
} 

私はこの問題が、文字列をSystem.TimeSpanに変換しようとしているという事実と、私の.settingsファイルにある他のさまざまなクラスによって引き起こされたと思います。

パラメータの文字列を受け入れるDataBindings.Add(を使用してバインドしているので、そこに新しいキーワードをキャストしたり使用することはできません。

I コードで手動ですべてを扱うことができる

:オブジェクトのパラメータごとにパラメータを構築することで設定ファイルを更新するが、私はちょうどそれらをバインドすることを好むように多くのTextBoxとNumericUpDownsに保存されているので、多くの設定を持っています可能であれば、TextBoxに直接連絡してください。

私はこれを達成する最も簡単な方法は何ですか?

+0

WinForms、asp.net、WPFなど、使用している技術にタグを追加する必要があります。この質問は、C#と、あなたのプレゼンテーション技術と関係することとほとんど関係がありません。 –

+0

私はそれを編集してWinFormsであることを示しました。 – Ozzah

答えて

2

サンプルのWindowsフォームアプリケーションで次のコードを試しましたが、例外なく保存が行われました。

// Define the settings binding source 
private System.Windows.Forms.BindingSource settingsBindingSource; 

private void InitializeComponent() 
    { 
      this.components = new System.ComponentModel.Container(); 
      this.durationTextBox = new System.Windows.Forms.TextBox(); 
      this.settingsBindingSource = new BindingSource(this.components); 
      this.settingsBindingSource.DataSource = typeof(WindowsFormsApplication1.Properties.Settings); 
      this.durationTextBox.DataBindings.Add(new Binding("Text", this.settingsBindingSource, "Duration", true)); 
    } 

// In the form load event where the textbox is displayed 
private void Form1_Load(object sender, System.EventArgs e) 
{ 
    settingsBindingSource.DataSource = Settings.Default; 
} 

// save button click 
private void button1_Click_1(object sender, System.EventArgs e) 
{ 
    // This saved the settings, without any exceptions 
    Settings.Default.Save(); 
} 

希望します。

2

あなたはSettingsクラスの「変換プロパティ」(私はその用語を発明)宣言することができます:

public class Settings 
{ 
    // The real property 
    public TimeSpan StartWorkDay { get; set; } 

    // The conversion property 
    public string StartWorkDayString 
    { 
     get 
     { 
      return StartWorkDay.ToString(); 
      // (or use .ToString("...") to format it) 
     } 
     set 
     { 
      StartWorkDay = TimeSpan.Parse(value); 
      // (or use TryParse() to avoid throwing exceptions) 
     } 
    } 
} 

を...そしてそれにテキストボックスをバインドします。

0

私はあなたに興味があるかもしれないやや-エレガントな解決策を考え出した:問題は、私は単純なものから.settingsファイルに持っていたデータ型をキャストまたは構築することができなかったことと思われたので

私はデータバインディングを使用していたので、代わりにカスタムコントロールを作成しました。

たとえば、タイムスパンは今、アップ/ダウントグル無効日付で、私はDateTimePicker制御から作らTimeSpanPickerを使用し、Valueプロパティは、ピッカーコントロール内からのTimeSpanに変換されます。

このメソッドの追加の利点は、TimeSpanPickerベースコントロールのDateTimePickerに有効な時刻のみが表示されるため、テキストボックスで以前に必要としていた多くの検証を行う必要がないことです。私が行う必要のある小さな検証は、Set {}プロパティで実行できるので、イベントハンドラを定義する必要はありません。

これはうまくいくようです。 すべてのテキストボックスをカスタムコントロールに置き換えるだけで済みます。

関連する問題