2017-03-09 65 views
0

有人可以告訴我爲什麼當我嘗試將文本框綁定到SqlConnectionStringBuilder實例時,它不起作用,我收到錯誤消息。將Windows窗體綁定到SqlConnectionStringBuilder

「不能綁定到數據源的屬性或列的DataSource \ r \ n參數名稱:數據成員」

好像綁定管理器時,它反映了發現它無法找到屬性。

如果我寫一個只做轉發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#Remarks)爲允許的類型。 – TnTinMn

+0

我已閱讀您提到的部分。我沒有看到SqlConnectionStringBuilder類的組合在什麼地方將它定義爲有效的數據源。 –

回答

0

長時間閱讀,第一次發佈。這裏去...

設置階段:

•SqlConnectionStringBuilder自DbConnectionStringBuilder

繼承

•DbConnectionStringBuilder實現的接口:IDictionary的,ICollection的,IEnumerable的,和ICustomTypeDescription

這些用法類的接口是「奇怪的」...意味着沒有連接字符串的集合(只有一個)。這些接口的用法是管理「DataSource/ConnectionString」屬性中字符串元素的鍵/值對。

當你創建一個實現了INotifyPropertyChanged的是因爲BindingSource的知道如何從INotifyPropertyChanged接口拉沒有得到困惑的派生類實現的IDictionary/ICollection的/ IEnumerable的/ ICustomTypeDescription的包裝(即你綁定你的樣品運作的原因到僅實現一個接口INotifyPropertyChanged的具體類)。除了你的解決方法之外,我認爲另一種方法是使用SqlConnection類來代替(它沒有關聯的收集接口)。

關於綁定源代碼的內部最好的深潛篇是這個博客:https://www.codeproject.com/Articles/24656/A-Detailed-Data-Binding-Tutorial。查看「它是如何工作的?」部分。我停下來看完這個追求綁定源的內部運作,並會做一些神奇的手臂揮舞着說,問題#1的地方,混亂中:P

問題#1 我無法實現INotifyPropertyChanged接口和任何IDictionary/ICollection/IEnumerable/ICustomTypeDescription,並使用「bindingSource」綁定類的非集合類型屬性(特定於字符串)。在你的情況下,這是「DataSource」屬性,它是一個字符串而不是「集合」類型。

我創建了一個實現INotifyPropertyChanged和任何其他接口(IDictionary/ICollection/IEnumerable/ICustomTypeDescription)的示例類。綁定從未使用Textblock.Text綁定工作到單個屬性。我無法找到任何結果爲人們嘗試這樣做,爲什麼它會失敗......顯然沒有人試圖實現INotifyPropertyChanged與任何其他受支持的可綁定接口... https://docs.microsoft.com/en-us/dotnet/framework/winforms/interfaces-related-to-data-binding。嘗試在實現多個可用/有效接口類型的類上使用bindingSource時,文檔是稀疏的。

Issue#2 BindingSource對象無法從派生類上的父類看到繼承的屬性。雖然不是問題的根本原因,但是派生的SqlConnectionStringBuilder會使情況複雜化。

最好的解釋:Why BindingSource component cannot see inherited properties? 它看起來像微軟承認的問題,並關閉該功能要求:https://connect.microsoft.com/VisualStudio/feedback/details/431273/interface-inheritance-bug 附加信息:在上面的最後一個環節提供Winforms databinding with interface inheritance 最合乎邏輯的理由 - 「接口支持多重繼承,但類沒有。 「

儘管這與您的問題沒有直接關係,但我認爲問題#1與問題#2類似,因爲」BindingSource「類的內部無法指定綁定到哪個接口給定現有的語法參數。

相關問題