2009-05-19 3 views
4

DataBindingsを活用して自分のプログラムを最適化する方法について少し困惑しています。私のプログラムは、データを格納する複数のLinq2SQLバウンドオブジェクトを使用します。すべてのORMオブジェクトは階層に格納されます。 2番目のGUIプロジェクトでは、このデータをテキストフィールドとコンボボックスフィールドに表示しています。Linq2SQLコレクションをデータ型に変換してテキストフィールドをwinformする方法

次のようなデータ構造の階層は次のとおりです。

  • JobManagerは各Jobitemは正確に一つのArticle

Jobが含まれている各ジョブがJobitems

  • の辞書が含まれていJobs
  • の辞書が含まれています、JobitemおよびArticleはそれぞれLinq2SQL ORMを表すオブジェクト。

    私は2つのリストビューとタブペインを持つGUIを持っています。タブペインには、ジョブ、ジョブアイテム、および記事のプロパティが表示され、ジョブとジョブアイテムを変更することができます。 GUIは次のように振る舞うべき:

    1. Jobが最初にリストビューで選択されている

      は、関連jobitemsは、タブのペインに表示されているジョブに関する二ListViewコントロールと詳細情報に表示されます。
    2. 2番目のListViewでJobitemが選択されている場合、ジョブ明細とアーティクルの詳細がタブペインに表示されますが、ジョブアイテム情報のみが編集可能です。
    3. 変更が完了したら、ユーザーは意図的に変更を保存する必要があります。そうしないと、変更は破棄され、データベースに同期されません。

    この動作はどのようにしてDataBindingで実現できますか?

    特に、完全なコレクションを1つのTextFieldに一度​​バインドして、リストビュー内で選択した位置に移動できますか?または、ユーザーが実行するすべての選択について、ジョブごとに個別のデータバインディングを追加および削除する必要がありますか?

  • +0

    あなたのご意見をお寄せください - テキストフィールドを追加します... –

    答えて

    4

    「辞書」は本当ですか? Winformバインドはリスト(IList/IListSource)ではOKですが、辞書ではできません。さらに、ListViewは他のコントロールと同じようにバインドするのが簡単ではありません。

    それ以外は、純粋にマッピング名を使用して動作する必要があります - 私は簡単な例をしようとします...


    Northwindの基本的な例で編集します。データ・コンテキストは理想的には長生きするべきではないことに注意してください。あなたはまた、リポジトリの実装ではなく、直接結合のようなものを見てみたいことがあります。

    using System; 
    using System.Windows.Forms; 
    using SomeNamespaceWithMyDataContext; 
    static class Program 
    { 
        [STAThread] 
        static void Main() { 
         MyDataContext ctx = new MyDataContext(); 
         BindingSource custs = new BindingSource() { 
          DataSource = ctx.Customers}; 
    
         BindingSource orders = new BindingSource { 
          DataMember = "Orders", DataSource = custs}; 
    
         Button btn; 
         using (Form form = new Form 
         { 
          Controls = { 
           new DataGridView() { 
            DataSource = orders, DataMember = "Order_Details", 
            Dock = DockStyle.Fill}, 
           new ComboBox() { 
            DataSource = orders, DisplayMember = "OrderID", 
            Dock = DockStyle.Top}, 
           new ComboBox() { 
            DataSource = custs, DisplayMember = "CompanyName", 
            Dock = DockStyle.Top},     
           (btn = new Button() { 
            Text = "Save", Dock = DockStyle.Bottom 
           }), // **edit here re textbox etc** 
           new TextBox { 
            DataBindings = {{"Text", orders, "ShipAddress"}}, 
            Dock = DockStyle.Bottom 
           }, 
           new Label { 
            DataBindings = {{"Text", custs, "ContactName"}}, 
            Dock = DockStyle.Top 
           }, 
           new Label { 
            DataBindings = {{"Text", orders, "RequiredDate"}}, 
            Dock = DockStyle.Bottom 
           } 
          } 
         }) 
         { 
          btn.Click += delegate { 
           form.Text = "Saving..."; 
           ctx.SubmitChanges(); 
           form.Text = "Saved"; 
          }; 
          Application.Run(form); 
         } 
        } 
    } 
    

    余談として - 構文ことに注意してください:

    DataBindings = {{"Text", orders, "ShipAddress"}} 
    

    は同等です:

    someTextBox.DataBindings.Add("Text", orders, "ShipAddress"); 
    

    (私はよくある質問のようにこれを追加します)

    +0

    最初に、精巧な返答をいただきありがとうございます! 辞書ではうまくいかないことは分かりませんでしたが、昔ながらのデザインからは辞書があります。私はそれらを一時的なリストに変換することができました。ユーザーが「保存」を押すとすぐに、データベースに変更を保存するために辞書に戻すことができます。これは私の3番目の点を解決するだろう。 テキストフィールドはどうですか?どのように私は単一の仕事の "名前"のテキストファイルをバインドするのですか? DataSourceとして、または特定の仕事をしているたびに、完全なジョブリストを使用していますか? –

    +0

    いくつかのテキストフィールドを追加... –

    +0

    このようにして、例えばTextFieldに単一のジョブを表示させることができます。 this.BindingContext [custs、 "ContactName"]。位置? –

    関連する問題