Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > User control datasource


Автор: webgraf 17.12.2008, 16:04
VS2008.
Контрол состоит из textbox и listbox. В listbox нужно биндить данные.
Можно ли сделать контрол так, чтобы биндить как обычный listbox в design-mode, с выборкой из доступных datasource?
В msdn на эту тему есть статья(http://msdn.microsoft.com/en-us/library/ms233813.aspx), но это не совсем то. 
Хотелось бы сделать как у стандартных элементов. 
У кого нибудь получалось?

Автор: Partizan 17.12.2008, 16:24
webgraf, а в чём проблема? делаете свойства-обёртки для свойств listbox-а, проставляете им нужные атрибуты и вуаля....

Автор: webgraf 17.12.2008, 16:48
проблема в удобстве. 
обернуть DataSource listbox-а можно свойством типа Object. при этом в design-mode вообще не получится его редактировать.
максимум что удается сделать, это как в примере, указать LookupBindingProperties для моего контрола. И уже из окна Datasource "биндить" источник данных на мой контрол.
А хотелось бы как со стандарными элементами. Кинуть на форму и в меню Tasks выбрать нужный источик данных.

или есть какой то атрибут свойства, который говорит дизайнеру что надо искать источик данных?

Автор: Partizan 17.12.2008, 17:10
webgraf, надо просто EditorAttribute выставить, вот и всё

Автор: webgraf 17.12.2008, 18:17
Что то на эту тему мало информации. :(
Я так понял надо прописать что-то типа этого перед нужным свойством:

[EditorAttribute("System.Windows.Forms.Design.DataMemberListEditor, System.Design", typeof(System.Drawing.Design.UITypeEditor))]

Как найти нужный мне класс System.Windows.Forms.Design ?    Данный пример не показывает источники данных проекта. :( может что то не так настроено?

Автор: Partizan 17.12.2008, 18:21
Вот пример:

Код

///
/// Get/Set the datasource
///
[TypeConverter("System.Windows.Forms.Design.DataSourceConverter")]
public object DataSource
{
    get { return _dataSource ; }
    set
    {
        // Ensure that the screen is only updated when the datasource changes
        if ( _dataSource != null && _dataSource.Equals ( value ) )
            return ;

        _dataSource = value ;

        // Reset the datamember
        _dataMember = String.Empty ;
    }
}

Автор: webgraf 17.12.2008, 18:54
а это для какой студии? у меня не заработало. Зато заработало так:

Код

        [AttributeProvider(typeof(IListSource))]
        public object DataSource
        {
            get
            {
                return listBox1.DataSource;
            }
            set
            {
                listBox1.DataSource = value;
            }
        }

Теперь все именно так как хотел smile В общем случае можно использовать http://www.red-gate.com/products/reflector/. 
Там ищем нужный нам класс(например Datagrid), и смотрим как в нем описано нужное нам свойство.

Спасибо Partizan! ;)

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