Проблема с Tabcontrol в разных платформах.NET
Я разработал приложение Winforms C# два года назад, используя Visual Studio 2010 (целевая среда: .NET Framework 4 Client Profile).
Это приложение имеет Form1: Form, INotifyPropertyChanged с tabcontrol с несколькими вкладками. Я связал пользовательские свойства своей формы с элементами управления, которые находятся на вкладках, которые не видны при создании формы. Привязки такие:
BindingSource BndFrom1 = new BindingSource();
BndFrom1.DataSource = typeof(Form1);
BndFrom1.Add(this);
TxtTemperature.DataBindings.Add("Text", BndFrom1, "TemperatureString", true, DataSourceUpdateMode.OnPropertyChanged);
Это работало нормально. После перехода на Windows 10 с.NET Framework 4.6 приложение неожиданно перестало работать нормально, стало медленным или полностью зависло при переходе на другую вкладку. Если я менял порядок вкладок, это всегда была первая страница, которая работала нормально. Я попытался "заставить" 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 });
}
на всех вкладках, но это не сработало.
После того, как я удалил все привязки данных с элементами управления на вкладках, проблема была решена.
У меня была первая версия моего приложения с привязками данных, все еще работавшая с propper на ПК с Windows 7. Но после обновления до.NET Framework 4.7 у него возникли те же проблемы, и после установки новой версии приложения оно исчезло.
Является ли это известной проблемой, и если да, есть ли объяснение и решение для нее? У кого-нибудь есть лучшее решение, с помощью которого я могу продолжать использовать привязки?
Заранее спасибо,
электрический
1 ответ
Мы пытались воспроизвести эту ошибку, но безуспешно. Не могли бы вы поделиться примером приложения, которое продемонстрирует проблему? Вот что мы сделали: 1. Создаем приложение winforms 2. Добавьте метку и вкладку с двумя вкладками в форму 3. Добавьте текстовое поле на вторую вкладку в вкладке управления 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");
}
}
}
Спасибо таня