2017-07-20 38 views
1

兩年前,我使用Visual Studio 2010開發了Winforms C#應用程序(目標框架:.NET Framework 4客戶端配置文件)。在不同的.NET框架中使用Tabcontrol問題

此應用程序有一個Form1:Form,INotifyPropertyChanged帶有tabcontrol的tabcontrol。我綁定了我的窗體的自定義屬性,這些窗體是在構造窗體時不可見的標籤頁上的控件。綁定是這樣的:

BindingSource BndFrom1 = new BindingSource(); 
BndFrom1.DataSource = typeof(Form1); 
BndFrom1.Add(this); 

TxtTemperature.DataBindings.Add("Text", BndFrom1, "TemperatureString", true, DataSourceUpdateMode.OnPropertyChanged); 

這工作正常。在使用.NET Framework 4.6切換到Windows 10後,應用程序突然不能正常工作,切換到另一個頁面時,應用程序變慢或卡住了。如果我改變了標籤頁的順序,它總是第一個正常工作的標籤頁。 我試圖「力」 Form1中通過調用

private static void CreateControls(Control control) 
     { 
      CreateControl(control); 
      foreach (Control subcontrol in control.Controls) 
      { 
       CreateControl(subcontrol); 
      } 
     } 
     private static void CreateControl(Control control) 
     { 
      var method = control.GetType().GetMethod("CreateControl", BindingFlags.Instance | BindingFlags.NonPublic); 
      var parameters = method.GetParameters(); 

      method.Invoke(control, new object[] { true }); 
     } 
所有的TabPages

創建invissible控制,但這並沒有工作。
當我通過控制頁面上的控件刪除所有數據綁定後,問題就解決了。

我有我的應用程序的第一個版本,與數據綁定,仍然在Windows 7 PC上運行propper。但是在.NET Framework 4.7的更新之後,它遇到了同樣的問題,並且在安裝新版本的應用程序後,它不見了。

這是一個已知的問題,如果有,是否有解釋和解決方案?有沒有人有更好的解決方案,我可以繼續使用綁定?

由於提前,

ELEC

回答

0

我們曾試圖重現這個bug,但沒有成功。你能否分享一個可以證明問題的示例應用程序? 以下是我們所做的: 1.創建一個winforms應用程序 2.將標籤和帶有2個選項卡的tabcontrol添加到表格 3.將文本框添加到tabcontrol的第二個選項卡 4.打開數據綁定標籤該表單屬性反映了第二個選項卡上文本框內容的表單上的屬性 與您的代碼相比,您看到此重複嘗試中缺少什麼?我們還嘗試過將數據綁定到SQL數據庫。並沒有看到框架的4.0和4.7版本有任何不同。

這裏是Form1.cs的代碼:

using System; 
using System.ComponentModel; 
using System.Runtime.CompilerServices; 
using System.Windows.Forms; 

namespace WindowsFormsApp5 
{ 
    public partial class Form1 : Form, INotifyPropertyChanged 
    { 
     public Form1() 
     { 
      InitializeComponent(); 

      BindingSource bindingSource = new BindingSource(); 
      bindingSource.DataSource = typeof(Form1); 
      bindingSource.Add(this); 

      label1.DataBindings.Add("Text", bindingSource, "CustomProperty1", true, 
       DataSourceUpdateMode.OnPropertyChanged); 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
     { 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
     } 

     public string CustomProperty1 { 
      get { return textBox1.Text; } 
      set { 
       NotifyPropertyChanged(); 
      } 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      textBox1.Text = "thing1"; 
     } 

     private void textBox1_TextChanged(object sender, EventArgs e) 
     { 
      NotifyPropertyChanged("CustomProperty1"); 
     } 
    } 
} 

謝謝,蔡健雅