Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Динамическое обновление контрола


Автор: Remember 11.6.2009, 21:38
Доброго времени суток!

Проблема заключается в следующем, динамически создаю большое количество textBlock или label, с определенным содержимым. Помещаю их в ячейки gridInputPoints, который состоит из 4 столбцов, а количество строк передается как параметр из txtQtyOfPoints. В первый раз отрисовка не вызывает никаких нареканий, а дальше начинаются чудеса. При изменении текста в txtQtyOfPoints, кусок кода представленный ниже выполняется снова и происходит наложение на первый ряд последнего gridInputPoints т.е. текст в textBlock или label становится нечитаемым. 

Только начал изучать WPF, может быть ошибка глупая, но как не бился найти её не смог. Может быть ссылка на textBlock или label где-то остается, например в первом ряду gridInputPoints, или ещё чего-то не совсем понятно. Не могу понять :(

Буду благодарен за любую помощь.

Код

            gridInputPoints.RowDefinitions.Clear();
            gridInputPoints.Refresh();
            gridInputPoints.InvalidateVisual();
            if (txtQtyOfPoints.Text != "")
            {
                RowDefinition rowFirst = new RowDefinition();
                rowFirst.Height = GridLength.Auto;
                gridInputPoints.RowDefinitions.Add(rowFirst);
                for (int i = 0; i < Convert.ToInt16(txtQtyOfPoints.Text); i++ )
                {
                    string name = "Row" + Convert.ToInt16(i + 1);
                    RowDefinition row = new RowDefinition();
                    row.Name = name;
                    gridInputPoints.RowDefinitions.Add(row);

                    //TextBlock textBlock = new TextBlock();
                    //textBlock.HorizontalAlignment = HorizontalAlignment.Center;
                    //textBlock.Name = "txtNumber" + Convert.ToInt16(i + 1);
                    //textBlock.Text = "Точка " + Convert.ToInt16(i + 1);
                    //textBlock.Refresh();
                    //textBlock.InvalidateVisual();
                    //Grid.SetRow(textBlock, i + 1);
                    //Grid.SetColumn(textBlock, 0);
                    //gridInputPoints.Children.Add(textBlock);

                    Label lab = new Label();
                    lab.Content = "Точка " + Convert.ToInt16(i + 1);
                    Grid.SetRow(lab, i+1);
                    Grid.SetColumn(lab, 0);
                    gridInputPoints.Children.Add(lab);

                    TextBox textBox = new TextBox();
                    textBox.Text = "Привет " + Convert.ToInt16(i);
                    Grid.SetRow(textBox, i + 1);
                    Grid.SetColumn(textBox, 1);
                    gridInputPoints.Children.Add(textBox);
                }
            }


P.S. gridInputPoints.Refresh() - ререндеринг grid.

Автор: Remember 18.6.2009, 12:54
Решил проблему.

Код

GridInputPoints.Children.Clear();


Полностью избавляется от предыдущих данных.

Автор: WolfTheGrey 20.6.2009, 02:42
.Refresh() - очень хорошая штука если дочерняя форма имеет свойство "ShowInTaskbar = false;" и потерялась в рабочем столе среди других окон, то вызвав этот метод, дочерняя форма вылезет на первый план.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)