C # Почему невозможно установить определенные действия для GUI в конструкторе winform? - PullRequest
3 голосов
/ 06 июля 2010

Мне было интересно, почему невозможно установить некоторые свойства в конструкторе winform.Например, у меня есть Expandable splitter (библиотека devcomponents), и когда я устанавливаю свойство Expanded в false, в конструкторе ничего не происходит, но когда я помещаю тот же код в событие загрузки формы, он работает, как и ожидалось.Я помещаю этот код после метода InitializeComponent ().

Другая ситуация, хотя и немного другая, заключается в следующем.Когда вы динамически создаете комбинированный список в классе и устанавливаете выбранный индекс, отличный от первого элемента, а затем возвращаете этот комбинированный список, для выбранного индекса в форме возвращается значение 1.

Почему это так?

Фрагмент кода для первой ситуации (обновлено):

// This works in the form_load event but not in the form constructor (after InitializeComponent())
if (_tabId != -1)
{
    this.SuspendLayout();
    expandableSplitter1.SuspendLayout();

    expandableSplitter1.Expanded = false;
    expandableSplitter1.Enabled = false;

    // Hide all tabs, except the selected tab
    tabControl1.Tabs.Clear();

    QuestionTab tab = new QuestionTab(_tabId);

    TabItem tabItem = tabControl1.CreateTab(tab.Description);
    tabItem.Tag = tab;

    tabControl1.SelectedTabIndex = 0;

    TabItem_Click(tabItem, null);

    expandableSplitter1.ResumeLayout(true);
    this.ResumeLayout(true);
}

Фрагмент кода для второй ситуации:

public Control GenerateList(Question question)
{
    // some code is omitted

    ComboBox cmb = new ComboBox();

    cmb.SuspendLayout();

    cmb.Name = "cmb";
    cmb.DisplayMember = "Answer";
    cmb.ValueMember = "Id";
    cmb.DataSource = answers;
    cmb.Dock = DockStyle.Top;

    cmb.SelectedValue = 3; // not the first index


    cmb.DropDownStyle = ComboBoxStyle.DropDownList;
    cmb.SelectedIndexChanged += new EventHandler(cmb_SelectedIndexChanged);

    cmb.ResumeLayout(true);

    return cmb;
}

Ответы [ 2 ]

1 голос
/ 06 июля 2010

Проблема в том, что эти свойства имеют побочный эффект . Это приведет к аннулированию элемента управления, который пытается перерисовать себя, но это не работает, потому что на самом деле мы находимся в конструкторе, и мы ничего не можем нарисовать. Таким образом, приводя к переключению обратно к предыдущему или значению по умолчанию (в зависимости от реализации конкретного элемента управления).

Чтобы это сработало, вам нужно внимательнее взглянуть на функцию InitializeComponent(). Прежде чем начать устанавливать что-либо в элементах управления, он вызывает Control.SuspendLayout(), а затем Control.ResumeLayout(false).

Вы должны делать то же самое, но не только на самом элементе управления, а также на всех родительских элементах управления (может быть, TableLayoutPanel или любом другом элементе управления контейнера), пока не достигнете вершины, вызвав this.SuspendLayout().

Также вы должны позаботиться о заказе. Приостановить от верхнего управления (это) до того, который вам нравится, и возобновить в обратном порядке. В случае стандартных элементов управления Windows это должно работать. Если вы используете какой-либо сторонний контроль, то поставщик должен позаботиться об этом.

Обновление

После прочтения ваших обновлений и комментариев я сделал новый проект и поместил TabControl с несколькими страницами. Также я поместил ComboBox на третью страницу и добавил некоторые элементы.

Затем я изменил свой код следующим образом:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        tabControl1.SelectedIndex = 1;
        comboBox1.SelectedIndex = 2;
    }
}

и работает как положено (без использования SuspendLayout() или ResumeLayout()).

Итак, чтобы действительно найти ошибку в вашем приложении, запустите новую пустую и начните заполнять ее существующим кодом или просто используйте подход OnLoad().

0 голосов
/ 06 июля 2010

Я предполагаю, что одно из событий ExpandableSplitter по умолчанию имеет значение true. Материал DevComponents смешной. Вы устанавливаете его до или после вызова InitializeComponent ()?

Понятия не имею по второму.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...