Проблема с DataBindings
От: 4wd Россия  
Дата: 27.09.05 09:42
Оценка:
Есть DataTable (называется fPersonFull). Есть набор кантролов на форме, которые динамически привязываются к этой таблице, например так:
textBox1.DataBindings.Add("Text",fPersonFull,"LastName");

Есть кнопка:
    this.BindingContext[fPersonFull].EndCurrentEdit();
    this.BindingContext[fPersonFull].AddNew();

Глюк в том, что при нажатии на кнопку кантролы продолжают отображать старое содержимое.Смена позиции в таблице вручную не помогает. Если прикрутить к таблице dataGrid, в нем все выглядит так: новая строка добавляется, но указатель остается на текущей записи.
Бьюсь весь день, уже с нуля написал приложение с такой же фигней — там ВСЕ РАБОТАЕТ. Но мне нужно сделать в этом.
Народ, если кто сталкивался с этой проблемой или похожей подскажите плиз в чем тут может быть дело.
Re: Проблема с DataBindings
От: andreich78 Россия  
Дата: 27.09.05 10:23
Оценка:
Здравствуйте, 4wd, Вы писали:

4wd>Есть DataTable (называется fPersonFull). Есть набор кантролов на форме, которые динамически привязываются к этой таблице, например так:

4wd>
4wd>textBox1.DataBindings.Add("Text",fPersonFull,"LastName");
4wd>

4wd>Есть кнопка:
4wd>
4wd>    this.BindingContext[fPersonFull].EndCurrentEdit();
4wd>    this.BindingContext[fPersonFull].AddNew();
4wd>

4wd>Глюк в том, что при нажатии на кнопку кантролы продолжают отображать старое содержимое.Смена позиции в таблице вручную не помогает. Если прикрутить к таблице dataGrid, в нем все выглядит так: новая строка добавляется, но указатель остается на текущей записи.
4wd>Бьюсь весь день, уже с нуля написал приложение с такой же фигней — там ВСЕ РАБОТАЕТ. Но мне нужно сделать в этом.
4wd>Народ, если кто сталкивался с этой проблемой или похожей подскажите плиз в чем тут может быть дело.
убедись, что все контролы используют один и тот же BindingContext.
а в гриде ничего не видишь потому что он к другому CurrencyManager`у прибинден — небось задавал биндинг с помощью DataSource и DataMember? поставь DataSource = fPersonFull.
Re[2]: Проблема с DataBindings
От: 4wd Россия  
Дата: 27.09.05 10:42
Оценка:
Здравствуйте, andreich78, Вы писали:

A>убедись, что все контролы используют один и тот же BindingContext.

как в этом убедиться. Все контролы созданы вместе с формой, только Bindings у них периодически clear и add. Они что каждый раз в новом контексте привязываются?
Пробовал им вручную назначать BindingContext формы — вообще ни хрена не отображается.
A>а в гриде ничего не видишь потому что он к другому CurrencyManager`у прибинден — небось задавал биндинг с помощью DataSource и DataMember? поставь DataSource = fPersonFull.
Оно так и стоит DataSource = fPersonFull и тоже периодически обновляется. Дело в том, что там нельзя один раз прибиндить и забыть — fPersonFull каждый раз новая таблица.
Re[3]: Проблема с DataBindings
От: andreich78 Россия  
Дата: 27.09.05 10:50
Оценка:
Здравствуйте, 4wd, Вы писали:

4wd>Здравствуйте, andreich78, Вы писали:


A>>убедись, что все контролы используют один и тот же BindingContext.

4wd>как в этом убедиться. Все контролы созданы вместе с формой, только Bindings у них периодически clear и add. Они что каждый раз в новом контексте привязываются?
4wd>Пробовал им вручную назначать BindingContext формы — вообще ни хрена не отображается.
A>>а в гриде ничего не видишь потому что он к другому CurrencyManager`у прибинден — небось задавал биндинг с помощью DataSource и DataMember? поставь DataSource = fPersonFull.
4wd>Оно так и стоит DataSource = fPersonFull и тоже периодически обновляется. Дело в том, что там нельзя один раз прибиндить и забыть — fPersonFull каждый раз новая таблица.

...понятно, что ничё не понятно...
посмотри на экземпляр биндинга какого-нить контрола в момент после EndCurrentEdit. убедись, что его BindingManagerBase совпадает с this.BindingContext[fPersonFull]
посмотри на dataGrid.BindingContext[dataGrid.DataSource,dataGrid.DataMember], сравни его с this.BindingContext[fPersonFull]
если всё совпадает — тогда вообще не понятно.
и опиши алгоритм привязывания биндингов.
Re[4]: Проблема с DataBindings
От: 4wd Россия  
Дата: 27.09.05 11:12
Оценка:
Здравствуйте, andreich78, Вы писали:

A>...понятно, что ничё не понятно...

A>посмотри на экземпляр биндинга какого-нить контрола в момент после EndCurrentEdit. убедись, что его BindingManagerBase совпадает с this.BindingContext[fPersonFull]
A>посмотри на dataGrid.BindingContext[dataGrid.DataSource,dataGrid.DataMember], сравни его с this.BindingContext[fPersonFull]
A>если всё совпадает — тогда вообще не понятно.
A>и опиши алгоритм привязывания биндингов.

Написал
            BindingManagerBase bm = this.BindingContext[fPersonFull];
            this.BindingContext[fPersonFull].EndCurrentEdit();
            if (textBox1.BindingContext[fPersonFull] == bm)
                MessageBox.Show("Equals!");
            else
                MessageBox.Show("FUCK!");
            if (dataGrid1.BindingContext[fPersonFull] == bm)
                MessageBox.Show("Equals 2!");
            else
                MessageBox.Show("FUCK 2!");
            this.BindingContext[fPersonFull].AddNew();

Получил что все равны.
А что до алгоритма привязывания биндингов...
При запросе пользователя таблица fPersonFull получается через сеть. Там одна запись. После чего всем контролам на форме очищается DataBinding и назначается снова из таблицы fPersonFull:
textBox1.DataBindings.Clear();
textBox1.DataBindings.Add("Text",fPersonFull,"LastName");

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