C # Почему событие TextChanged принимает предыдущую ширину? - PullRequest
1 голос
/ 08 января 2010

В моем приложении winforms у меня есть код, который необходимо выполнить после изменения текста. На этикетке есть текстовое событие со следующим кодом:

string value = lblText.Text;
int labelWidth = lblText.Width;
int controlWidth = groupPanel1.Width;

int difference = controlWidth - labelWidth;

lblText.Left = difference / 2;

Когда я устанавливаю точку останова на string value = lblText.Text;, я вижу правильное значение. Но свойство width возвращает ширину предыдущего значения свойства text.

Например:

Первый раз: text = "Привет, мир!" ширина: 0

Второй раз: текст = "h" ширина: 60 ​​

В третий раз: text = "hi" ширина: 13

Как это возможно?

Ответы [ 2 ]

4 голосов
/ 08 января 2010

Если это метка с включенным свойством autosize, то она будет восстановлена ​​после события рисования. Похоже, что вы меняете текст и запрашиваете новую ширину, но не запрашиваете после рисования, поэтому он все еще имеет последнюю ширину.

0 голосов
/ 08 января 2010

Вы должны использовать что-то вроде этого (ваш код перенесен в делегат):

private void label1_TextChanged(object sender, EventArgs e) {
    this.BeginInvoke(new Action(delegate {
        string value = lblText.Text;
        int labelWidth = lblText.Width;
        int controlWidth = groupPanel1.Width;
        int difference = controlWidth - labelWidth;
        lblText.Left = difference / 2;
                    this.Text = label1.Width.ToString();
    }));
}

Поместите этот код в обработчик TextChanged.

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