powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / DataBinding в своём контроле
9 сообщений из 9, страница 1 из 1
DataBinding в своём контроле
    #32331688
Dronopotamus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую.
Добавляю TreeView возможность работы с данными: добавил датасоус и т.д.
При присвоении датасоурсу значения должен инициализироваться CurrencyManager вот так:
Код:
1.
2.
cm = (CurrencyManager)BindingContext[value];
cm.PositionChanged += new System.EventHandler(OnPositionChanged);

проблемма в том, что BindingContext всегда = null, т.е. базовый класс(TreeView) его почему-то не создаёт. Если BindingContext создать явно в конструкторе - обработчик OnPositionChanged срабатывает когда позиция меняется в моём контроле, и не срабатывает если в другом, который использует тот же datasource.
Как правильно инициализировать BindingContext?
Заранее спасибо.

зы. На всякий случай проперти датасоурс:

[code]

public object DataSource
{
get { return m_DataSource; }
set
{
if (value == null) { cm = null; this.GroupingChanged(); }
else
if (m_DataSource != value)
{
if (!(value is IList || value is IListSource))
throw new System.ArgumentException("Invalid DataSource");
else if (value is IListSource)
{
IListSource mylist = value as IListSource;
if (mylist.ContainsListCollection)
throw new System.ArgumentException("Invalid DataSource");
//ok
m_DataSource = value;
if (cm != null) cm.PositionChanged -= new System.EventHandler(OnPositionChanged);
if (BindingContext == null) cm = null;
else
{
cm = (CurrencyManager)BindingContext[value];
cm.PositionChanged += new System.EventHandler(OnPositionChanged);
}
this.GroupingChanged();
}
else
{
//ok
m_DataSource = value;
if (cm != null) cm.PositionChanged -= new System.EventHandler(OnPositionChanged);
if (BindingContext == null) cm = null;
else
{
cm = (CurrencyManager)BindingContext[value];
cm.PositionChanged += new System.EventHandler(OnPositionChanged);
}
this.GroupingChanged();
}
}
}
...
Рейтинг: 0 / 0
DataBinding в своём контроле
    #32331790
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BindingContext не надо создавать, он "наследуется" от родительского контрола: формы, панели, групбокса и пр. если ничего не трогать то у всех контролов будет один и тот же BindingContext - это контекст формы. если создал сам, то в нем будет свой набор CurencyManager"ов, не зависящий от других для того же самого datasource.

так что проверь свойство Parent в своем контроле. если там null, то в качестве контекста бери контекст формы (т.к. ).
...
Рейтинг: 0 / 0
DataBinding в своём контроле
    #32331871
Dronopotamus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо.
Я сделал вот как:
Наследовал класс от интерфейса ISupportInitialize, в EndInit прописал

Код: plaintext
1.
2.
3.
4.
if (this.Parent != null)
   if (this.BindingContext != this.Parent.BindingContext)
      this.BindingContext = this.Parent.BindingContext;
if (DataSource != null) InitCurrencyManager(DataSource);


только если Parent = null - у меня беда :(
как получить указатель на форму, на которую помещён компонент?
...
Рейтинг: 0 / 0
DataBinding в своём контроле
    #32331902
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
странно... вообще то представлялось, что компонент наследовался от TreeView.
ну а если нет parent'а, тут уж труба - контрол вистит сам по себе - и к кому его цеплять решать надо самому.
...
Рейтинг: 0 / 0
DataBinding в своём контроле
    #32331913
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS: делай привязку в свойстве DataSource - может к этому моменту все рассосётся и появится нормальный parent. не стоит это выносить ни в конструктор ни в EndInit - тем более, что parent'а могут поменять на лету.
...
Рейтинг: 0 / 0
DataBinding в своём контроле
    #32331937
Dronopotamus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо за советы!
...
Рейтинг: 0 / 0
DataBinding в своём контроле
    #32333848
Dronopotamus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот такая штука:
Сделал датабиндинг, тривью строит дерево по данным, прям как у DevExpress ^), но вот какой имеется глюк (я не знаю в чем дело, поэтому опишу симптомы):


На форму помещаем мой тривью, присваиваем DataSource = Датасет1.Таблица1;
Потом на эту же форму помещаем DataGrid, DataSource = такой же как и у тривью (Датасет1.Таблица1).
Заполняем данными, строится дерево. Бродим по веткам - позиция в датагриде меняется (значит биндинг контекст один и тот же). Добавляем новый элемент в датагриде (10 по номеру (если с 0 считать)). В тривью срабатывает событие DataSource.ListChanged - дерево перестраивается, всё опять работает. Дальше опять в датагриде этот же элемент удаляем - опять срабатывает ListChanged, дерево перестраивается, НО при попытке перейти на какую-либо запись в гриде получаем :
DataError - Unable to update the row: Index 10 is not non-negative and belows total row count.

В чём проблемма, подскажите пожалуйста?

ЗЫ. А вообще есть где-нибудь чёткие доки (или хотябы нормальные исходники :)) по которым можно поучиться работать с датабиндингом?
Буду признателен за любые линки!
...
Рейтинг: 0 / 0
DataBinding в своём контроле
    #32337620
Полуэкт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот тебе ссылка ссылка

но я не дочитал ибо у меня чуть более простая задача опять :)

задам свой вопрос в другом треде...
...
Рейтинг: 0 / 0
DataBinding в своём контроле
    #32338145
Dronopotamus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я эту ссылку читаю каждый день перед сном :)

Такое впечатление что в этом примере они пытались чего-то скрыть ) -
Датасоурс присваивают только в рантайме, бандинг контекст нигде не синхронизируют с парентом (как я уже понял сам он этого не делает).... в общем плохой линк, но всёравно спасибо :)
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / DataBinding в своём контроле
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]