PropertyGrid
В PropertyGrid в качестве редактора свойства используется ListBox. Редактируемое свойство имеет тип string. Как сделать автоподстановку из ListBox при редактировании поля в PropertyGrid по первому символу не раскрывая ListBox. И как программно раскрыть ListBox при редактировании поля PropertyGrid, то есть не нажимая на кнопку PropertyGrid-а, а именно при вводе первого символа в поле или при установке курсора в это поле. Может нужен другой контрол... Посоветуйте.
1) Создание своего контрола для работы со свойствами:
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(button1);
Вот этой строчкой получили список всех свойств кнопки. Теперь имея коллекцию PropertyDescriptor можно вносить её в тот же ListBox.
2) Можно поизвращаться над PropertyGrid. На событие SelectedGridItemChanged получаем, какую запись в гриде редактируем. Для автозаполнения можно использовать свойство Data у GridItem. Допустим происходит редактирование строкового свойства. После окончания редактирования срабатывает свойство PropertyValueChanged. Пишешь такой обработчик:
private void propertyGrid1_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
{
if(e.ChangedItem.Tag==null) e.ChangedItem.Tag=new List<object>();
else
{
List<object> list = (e.ChangedItem.Tag as
List<object>);
if (!list.Contains(e.ChangedItem.Value))
list.Add(e.ChangedItem.Value);
}
}
Таким образом каждый Tag для свойства в PropertyGrid содержит список ранее набранных значений для автозаполнения.
Потом на обработку события SelectedGridItemChanged пишешь прорисовку отдельно созданного ListBox'а, в который размещаем список значений для автозаполнения. В других случаях этот наш ListBox не виден(Visible=false). На событие ListBox'а SelectedIndexChaged выясняешь, какое из значений выбрано и на собыите KeyPress (на кнопку Enter) убираешь ListBox и вставляешь выбранное значение в соответствующее поле в PropertyGrid.
Уффф! На самом деле в этой идее ничего сложного нет. В результате разбора твоего вопроса у меня получилась небольшая корявая наброска всего этого, могу подкинуть.
Цитата:
Уффф! На самом деле в этой идее ничего сложного нет. В результате разбора твоего вопроса у меня получилась небольшая корявая наброска всего этого, могу подкинуть.
Если не трудно, подкинь наброску пожалуйста
Ня вот, извиняюсь за задержку, работа напрягает:)
Цитата:
Originally posted by 3A3-968M
Ня вот, извиняюсь за задержку, работа напрягает:)
Ня вот, извиняюсь за задержку, работа напрягает:)
Благодарю! Буду разбираться
А вот как она ругается
Цитата:
C:\PROJ\MyPropGrid\MyPropGrid\Form1.cs(133): 'System.Windows.Forms.GridItem' does not contain a definition for 'Tag'
Вообще свойство Tag отвечает за ассоциацию с данными, определёнными пользователем. Не исключено, что в .NET Framework 1.1 есть какое-то свойство, которое за это отвечает. Если нет, то ассоциируй данные с именем свойства, создай хэш-таблицу с помощью класса Hashtable.