C # Winforms элементы TabControl читают как пустые, пока не выбран TabPage - PullRequest
2 голосов
/ 20 апреля 2010

У меня есть приложение Winform, которое я пишу на C #. В моей форме у меня есть TabControl с семью страницами, каждая из которых полна элементов (в первую очередь TextBoxes и DropDownLists). Я извлекаю некоторую информацию с помощью DataReader, заполняю DataTable и использую метод DataBindings.Add для заполнения этих элементов текущими значениями.

Пользователь может вводить данные в эти элементы, нажимать «Сохранить», а затем я устанавливаю параметры запроса ОБНОВЛЕНИЕ, используя текстовые поля элементов. Например:

updateCommand.Parameters.Add("@CustomerName", SqlDbType.VarChar, 100).Value = CustomerName.Text;

Проблема, с которой я столкнулся, заключается в том, что после загрузки формы все элементы считаются пустыми, пока я не выберу каждую вкладку вручную. Таким образом, если я нажимаю «Сохранить» сразу после загрузки формы, все поля на вкладках, которые я еще не выбрал, пытаются ОБНОВИТЬ с пустыми данными (не приятно). Когда я выбираю каждую вкладку, эти элементы теперь будут правильно отправлять свои данные. В настоящее время я разработал (очень) уродливый обходной путь, при котором я программно выбираю каждую вкладку, когда данные заполняются впервые, но это неприемлемое долгосрочное решение.

У меня вопрос: как я могу заставить все элементы на вкладках TabPage правильно возвращать свои данные до того, как пользователь выберет эту вкладку?

Ответы [ 4 ]

7 голосов
/ 21 апреля 2010

хо правильно; элементы на TabPage не создаются до тех пор, пока не будет выбран этот TabPage. Я просто добавил цикл при загрузке формы, который выбирает каждую вкладку, и теперь она работает нормально.

foreach (TabPage tp in tabControl1.TabPages)
    {
        page.Show();
    }
4 голосов
/ 21 апреля 2010

Я не уверен, если вы можете. Ниже приводится цитата из MSDN:

"Элементы управления, содержащиеся в TabPage, не создаются до тех пор, пока не отображается страница вкладки, и любые привязки данных в этих элементах управления не активируются, пока не отобразится страница вкладки."

Однако вместо того, чтобы код обновления получал значения непосредственно из элементов управления, возможно, вы могли бы создать класс, который мог бы содержать ту таблицу DataTable, которую вы используете для заполнения элементов управления, а затем, когда вызывается код обновления, он запрашивает класс для value и класс проверяет, загружен ли элемент управления, в противном случае он получает значение из DataTable.

1 голос
/ 21 апреля 2010

Проблема в том, что элементы управления не создаются, пока не отобразится вкладка. Одним из решений будет создание элементов управления при загрузке страницы следующим образом:

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 } );
}

Затем в конструкторе в вашей форме вы сделаете что-то вроде:

public Form()
{
    CreateControls( this.tabPage1 );
}

Это решение основано на том факте, что существует внутренний метод CreateControls, принимающий единственный логический параметр, который позволит вам создать элемент управления, даже если он невидим.

0 голосов
/ 20 марта 2015

Для решения этой проблемы я должен был добавить следующий код в событие загрузки формы;

this.tabcontrol1.BindingContext = this.BindingContext;

...