2017-03-09 4 views
0

誰かが表示されるのは、SqlConnectionStringBuilderインスタンスにテキストボックスをバインドしようとしたときにエラーが発生する理由を教えてください。WindowsフォームをSqlConnectionStringBuilderにバインドする

「データソースのプロパティまたは列データソースにバインドすることはできません\ rを\名前nParameter:データメンバー」それは、それはそれを見つけるために反映したときに、プロパティを見つけることができませんマネージャを結合のように思える

get/set操作を転送する「何もしない」ラッパーを書くと、期待どおりに動作します。

私はSqlConnectionStringBuilderオブジェクトを反映しましたが、プロパティに直接バインドできないと思うようなものは見られませんでした。私がコメントしたバージョンへのデータソースの割り当てを変更した場合

はここ

public partial class frmMain : Form { 

    private BindingSource bindingSource = new BindingSource(); 

    public frmMain() { 
     InitializeComponent(); 

     //bindingSource.DataSource = typeof(SqlConnectionStringBuilderWrapper); 
     bindingSource.DataSource = typeof(SqlConnectionStringBuilder); 

     tbDataSource.DataBindings.Add("Text", bindingSource, "DataSource"); 

     initializeConnectionStrings(); 
    } 

    private void initializeConnectionStrings() { 
     SqlConnectionStringBuilder defaultBuilder = null; 
     cmbConnectionStrings.DataSource = SqlConnectionStrings.ConnectionBuilders(out defaultBuilder); 

     //bindingSource.DataSource = new SqlConnectionStringBuilderWrapper(defaultBuilder); 
     bindingSource.DataSource = defaultBuilder; 

     cmbConnectionStrings.SelectedItem = defaultBuilder; 
    } 
} 

public class SqlConnectionStringBuilderWrapper : INotifyPropertyChanged {private SqlConnectionStringBuilder builder = null; 

    public SqlConnectionStringBuilderWrapper(SqlConnectionStringBuilder builder) { this.builder = builder; } 
    public SqlConnectionStringBuilder Builder { get { return builder; } set {} } 

    public string DataSource { 
     get { return builder.DataSource; } 
     set { 
      if (builder.DataSource != value) { 
       builder.DataSource = value; 
       OnPropertyChanged("DataSource"); 
      } 
     } 
    } 
... 
} 

...私が使用しているコードのモックアップです。できます。ラッパーがなぜ必要なのか分かりません。

ありがとうございます!

+0

ラッパーには何がありますか? –

+0

[BindingSource.DataSourceプロパティ]の[備考]セクション(https://msdn.microsoft.com/en-us/library/system.windows.forms.bindingsource.datasource(v = vs.110))を確認することをお勧めします。 aspx#備考)。 – TnTinMn

+0

あなたが言及したセクションを見直しました。私はSqlConnectionStringBuilderクラスの構成が有効なデータソースとしてそれを不適格とするところを見ませんでした。 –

答えて

0

長時間の読者、初めての投稿。ここで

がステージを設定...行く:IDictionaryを、ICollectionを、IEnumerableを、そしてICustomTypeDescription

これらの使用:DbConnectionStringBuilderには、インターフェースを実装しますSqlConnectionStringBuilder•

はDbConnectionStringBuilderに

から継承クラスのインターフェイスは "odd"です...つまり、接続文字列のコレクションがないことを意味します(1つしかありません)。これらのインタフェースの使用法は、文字列要素のキー/値のペアを "DataSource/ConnectionString"プロパティ内で管理することです。 BindingSourceがIDictionaryの/ ICollectionを/ IEnumerableを/ ICustomTypeDescriptionの派生クラスの実装について混乱し得ることなくINotifyPropertyChangedインターフェイスからプルする方法を知っているので、あなたがINotifyPropertyChangedのを実装してラッパーを作成したとき、あなたのサンプルが働く理由は

(IEあなたはバウンド1つのインタフェースINotifyPropertyChangedのみを実装する具象クラスに変換します。回避策の他に、SqlConnectionクラスを代わりに使用する方法もあります(コレクションインターフェイスは関連付けられていません)。

バインディングソースクラスの内部についての最も深いダイビングポストは、このブログ:https://www.codeproject.com/Articles/24656/A-Detailed-Data-Binding-Tutorialでした。 「どのように動作しますか?」のセクションをチェックしてください。私はこれを読んだ後バインディングソースの内部の仕組みを追求停止し、その問題の#1は、その混乱の内側のどこかにあると言って手を振って、いくつかの魔法の腕を行います:P

問題#1 私はINotifyPropertyChangedインターフェイスを実装することができませんでしたし、 ANYのIDictionary/ICollection/IEnumerable/ICustomTypeDescriptionを使用し、 "bindingSource"を使用して、クラスの非コレクション型プロパティ(文字列)をバインドします。あなたの場合、これは "コレクション"タイプではない文字列である "データソース"プロパティです。

他のインターフェイス(IDictionary/ICollection/IEnumerable/ICustomTypeDescription)のINotifyPropertyChangedとANYの両方を実装するサンプルクラスを作成しました。バインディングは、Textblock.Textバインディングを使用して単一のプロパティに機能しませんでした。私はこれをやろうとしている人のために何の結果も見つけられず、なぜ失敗するのでしょうか...明らかに誰もINotifyPropertyChangedを他のサポートされているバインド可能なインターフェイスと組み合わせて実装しようとしていません... https://docs.microsoft.com/en-us/dotnet/framework/winforms/interfaces-related-to-data-binding。複数の使用可能な/有効なインターフェイスタイプを実装するクラスでbindingSourceを使用しようとすると、ドキュメンテーションが疎です。

問題#2 BindingSourceオブジェクトは、派生クラスの親クラスから継承されたプロパティを参照することはできません。問題の根本的な原因ではありませんが、SqlConnectionStringBuilderは状況を複雑にします。

最良の説明:https://connect.microsoft.com/VisualStudio/feedback/details/431273/interface-inheritance-bug 追加情報:上記の最後のリンクで提供Winforms databinding with interface inheritance ベスト論理的な理由 - 「インターフェイスは多重継承をサポートしていますが、クラスにはないWhy BindingSource component cannot see inherited properties? Microsoftはこの問題を認め、機能要求を閉じたように見えます。 "

これはあなたの問題には直接関係していませんが、問題#1は#2を発行する同様の欠陥で、" BindingSource "クラスの内部ではバインドするインターフェイスを指定できません既存の構文パラメータが与えられている。

関連する問題