2017-07-20 69 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"); 
     } 
    } 
} 

谢谢,蔡健雅