|
Пустая запись в DataGridComboBoxColumn
|
|||
---|---|---|---|
#18+
Дано: Имеется DataGrid в котором есть несколько DataGridComboBoxColumn. Осуществлен биндинг данных (из ItemsSourse в таблицу подставляется необходимый ID в ячейку пишется название статуса) в поле к примеру Status_id. Поле Status_id может иметь значение Null. Как сделать присваивать значение Null Status_id используя DataGridComboBoxColumn? Как сделать так, чтобы можно выбирать в ComboBox значение Null или Status_id присваивалось значение Null по нажатию клавиши Del. Варианты: 1. Добавить null запись в ItemsSourse не помогло. В списке она есть, но выбрать ее нельзя. Почему, не понял. Такой вариант не плох и достаточно компактен. 2.Добавить обработчик клавиши Del. По ней Status_id присваивается значение Null В ComboBox этоn вариант проходит,а вот в DataGridComboBoxColumn нет события обработки нажатия кнопки. Можно ли его добавить к DataGridComboBoxColumn и не будет ли он конфликтовать с аналогичным обработчиком DataGrid. 3. Можно воспользоваться обработчиком события нажатия кнопки в DataGrid. Но как определить какая ячейка редактируется или выделена вся строка, а не ячейка? Кто какими способами пользовался? Какой предпочтительней? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2015, 22:24 |
|
Пустая запись в DataGridComboBoxColumn
|
|||
---|---|---|---|
#18+
UncleJo, UPD по пункту 2. Добавить обработчик можно, но он вызывается после аналогичного обработчика для ДатаГрида. Встает вопрос: Как определить какая ячейка редактируется ячейка при нажатии Del клавиши (выделение разрешено только по строкам)? По идее это должно как-то определяться в коллекции SelectedCells. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2015, 09:55 |
|
Пустая запись в DataGridComboBoxColumn
|
|||
---|---|---|---|
#18+
UncleJoМожно ли его добавить к DataGridComboBoxColumn и не будет ли он конфликтовать с аналогичным обработчиком DataGrid. Если нажатие должно распространяться только на ComboBox, то нужно его handle'ить. UncleJoДобавить обработчик можно, но он вызывается после аналогичного обработчика для ДатаГрида. Странно. Попробуйте preview-событие. Handle'ить аналогично. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2015, 10:18 |
|
Пустая запись в DataGridComboBoxColumn
|
|||
---|---|---|---|
#18+
Ilya81, Пардон, а что значит handle'ить? Тут еще образовался вопрос, как присвоить значение DataGridComboBoxColumn програмно? ComboBox позволяет присвоить SelectedItem=null; Здесь такого свойства нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2015, 10:50 |
|
Пустая запись в DataGridComboBoxColumn
|
|||
---|---|---|---|
#18+
Здесь написано . Но если смысл этого свойства не понятен, рекомендую разобраться, ибо это весьма существенный момент пользовательского интерфейса на WPF (не говоря уж о том, что аналогичные методы применяются не только в WPF). UncleJoТут еще образовался вопрос, как присвоить значение DataGridComboBoxColumn програмно? ComboBox позволяет присвоить SelectedItem=null; Здесь такого свойства нет. Используйте SelectedItemBinding. Кстати, вместо события можно использовать InputBindings, команды всегда handle'ят собития. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2015, 11:47 |
|
Пустая запись в DataGridComboBoxColumn
|
|||
---|---|---|---|
#18+
могу ошибаться, но на сколько я помню SelectionIndex = -1 снимает выделение с комбика ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2015, 12:57 |
|
Пустая запись в DataGridComboBoxColumn
|
|||
---|---|---|---|
#18+
Ilya81, спасибо/ обязательно прочитаю. Как вариант может помочь.. SelectedItemBinding=null не работает. SelectionIndex = нет такого свойства. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2015, 14:37 |
|
Пустая запись в DataGridComboBoxColumn
|
|||
---|---|---|---|
#18+
SelectedItemBinding надо не null присваивать, а ставить binding (желательно на view model) и через него задавать SelectedItem. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2015, 14:47 |
|
Пустая запись в DataGridComboBoxColumn
|
|||
---|---|---|---|
#18+
Ilya81, Вот тут я и сел в лужу. Пошел учить теорию. Сейчас прорабатываю вариант использования Sender из обработчика. Но Там так же DataContext не строка. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2015, 15:50 |
|
Пустая запись в DataGridComboBoxColumn
|
|||
---|---|---|---|
#18+
UncleJo, Сработал такой вариант: DataGridCell DC = sender as DataGridCell; ((tbl_infrastructure_projects)DC.DataContext).highway_id = null; Но обновление Ячейки происходит только после потери фокуса. Надо с DataGridCombobox работать. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2015, 15:58 |
|
Пустая запись в DataGridComboBoxColumn
|
|||
---|---|---|---|
#18+
Есть ещё такое свойство - позволяет обновлять по изменению значений свойств. А так, обычно я использую MVVM , для обработки нажатия клавиш через него InputBindings . ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2015, 16:21 |
|
Пустая запись в DataGridComboBoxColumn
|
|||
---|---|---|---|
#18+
Ilya81, Я думаю, это не верный путь. Лучше присвоить значение datagridcomboboxcolumn из кода сразу. Имя его известно. Остается понять как ему присвоить значение. Совсем не понял: SelectedItemBinding надо не null присваивать, а ставить binding (желательно на view model) и через него задавать SelectedItem. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2015, 16:55 |
|
Пустая запись в DataGridComboBoxColumn
|
|||
---|---|---|---|
#18+
UncleJoСовсем не понял: SelectedItemBinding надо не null присваивать, а ставить binding (желательно на view model) и через него задавать SelectedItem. Это про вариант с MVVM. Можно создать binding и в коде (хотя, я такие методы не практикую), проще всего, мне кажется всё равно так или иначе использовать интерфейс INotifyPropertyChanged. Есть ещё вариант найти ComboBox с помощью VisualTreeHelper и выставить его свойства напрямую, но по мне это совсем кривой вариант. DataGrid всё ж больше ориентирован на MVVM. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2015, 17:04 |
|
Пустая запись в DataGridComboBoxColumn
|
|||
---|---|---|---|
#18+
Ilya81, А зачем его искать. есть ссылка на DataGridCell в Сендере. У него есть название highway_id Тип (DataGridComboboxcolumn). Попутно нашел еще один вариант обнуления: ((tbl_infrastructure_projects)List_tbl_infrastructure_projects.SelectedItem).highway_id = null ; Но у него такая же беда. Мне\ет непосредственно значения в DataGrid, но не меняется DataGridComboboxcolumn Конечно можно использовать обработку события, если источник изменился изменить DataGridComboboxcolumn. Но мне видится правильным просто поменять значение SelectedItem будет правильней. Блин, но как к нему добраться! ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2015, 17:13 |
|
Пустая запись в DataGridComboBoxColumn
|
|||
---|---|---|---|
#18+
UncleJo, правильно, это использования связывания, а не страдание фигнёй, как говорит Ilya81, это как фундамент в WPF, без связывания всё это не имеет ни какого смысла. кстати, есть еще класс DataGridBoundColumn, с помощью наследования в нём можно переопределить всё как вашей душе угодно. Начиная от внешнего вида ячеек и заканчивая их поведением. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2015, 17:29 |
|
Пустая запись в DataGridComboBoxColumn
|
|||
---|---|---|---|
#18+
Roman Mejtes, Так все связано. Вопрос в том, как обнулить в DataGridComboboxcolumn, чтобы было сразу отображено в ячейке. Варианты: DataGridCell DC = sender as DataGridCell; ((tbl_infrastructure_projects)DC.DataContext).highway_id = null; ((tbl_infrastructure_projects)List_tbl_infrastructure_projects.SelectedItem).highway_id = null ; работают, но не отображаются сразу (в DataGridComboboxcolumn остается старое значение, пока ячейка не выйдет из состояния редактирования) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2015, 17:33 |
|
Пустая запись в DataGridComboBoxColumn
|
|||
---|---|---|---|
#18+
UncleJoА зачем его искать. есть ссылка на DataGridCell в Сендере. У него есть название highway_id Тип (DataGridComboboxcolumn). ... Но мне видится правильным просто поменять значение SelectedItem будет правильней. Блин, но как к нему добраться! У DataGridComboBoxColumn нет никакого SelectedItem, а DataGridColumn наследуется от DependencyObject (т. е. не является UIElement). У него есть метод GenerateElement, в котором DataGridComboBoxColumn создаёт ComboBox, который, в отличие от DataGridComboBoxColumn наследуется от класса Selector и содержит в иерархии наследования классы Control и UIElement. Есть доступ к его свойствам через стили в свойствах ElementStyle и EditingElementStyle, но они обращаются к template, а не к экземпляру ComboBox. SelectedItem возможно выставить только у самого ComboBox. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2015, 17:34 |
|
Пустая запись в DataGridComboBoxColumn
|
|||
---|---|---|---|
#18+
Ilya81, Получается, что напрямую задать значение нельзя? Может тогда перейти с DataGridComboBoxColumn на ComboBox? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2015, 17:39 |
|
Пустая запись в DataGridComboBoxColumn
|
|||
---|---|---|---|
#18+
UncleJoIlya81, Получается, что напрямую задать значение нельзя? Может тогда перейти с DataGridComboBoxColumn на ComboBox? Во варианте MVVM легко. Через обработчики событий - можно через VisualTreeHelper найти ComboBox, хотя сам я такие методы не практикую. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2015, 17:43 |
|
Пустая запись в DataGridComboBoxColumn
|
|||
---|---|---|---|
#18+
Ilya81, "Может тогда перейти с DataGridComboBoxColumn на ComboBox?" И тут не все просто. А как обратиться к ComboBox из кода. Кстати, визуально получается прикольней даже. <DataGridTemplateColumn x:Name="highwayColumn" ClipboardContentBinding="{x:Null}" Header="Highway" Width="70" > <DataGridTemplateColumn.CellTemplate> <DataTemplate> <ComboBox SelectedItem="{Binding Path=highway_id}" DisplayMemberPath="name_lat" SelectedValuePath="id" > <ComboBox.ItemBindingGroup> <BindingGroup/> </ComboBox.ItemBindingGroup> </ComboBox> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> Понятно, что highwayColumn, но .ItemsSourse уже нет. Можно в highwayColumn.CellTemplate, а дальше не понятно. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2015, 18:44 |
|
Пустая запись в DataGridComboBoxColumn
|
|||
---|---|---|---|
#18+
UncleJo, https://www.google.ru/webhp?sourceid=chrome-instant&rlz=1C1CHWL_ruRU612RU612&ion=1&espv=2&es_th=1&ie=UTF-8#newwindow=1&q=datagrid endedit wpf работайте в этом направлении Код: vbnet 1. 2.
старайтесь пользоваться MVVM - надежнее ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2015, 00:11 |
|
Пустая запись в DataGridComboBoxColumn
|
|||
---|---|---|---|
#18+
mr Vap, Идея хорошая. Только CommidEdit() И надо найти как преобразовать Cell или Сендер в DataGridEditingUnit ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2015, 01:11 |
|
Пустая запись в DataGridComboBoxColumn
|
|||
---|---|---|---|
#18+
UncleJo, Задача в чем? авторДано: Имеется DataGrid в котором есть несколько DataGridComboBoxColumn. Осуществлен биндинг данных (из ItemsSourse в таблицу подставляется необходимый ID в ячейку пишется название статуса) в поле к примеру Status_id. Поле Status_id может иметь значение Null. Как сделать присваивать значение Null Status_id используя DataGridComboBoxColumn? Как сделать так, чтобы можно выбирать в ComboBox значение Null или Status_id присваивалось значение Null по нажатию клавиши Del. вам не надо лезть в DataGridComboBoxColumn вам нужен Item как вариант по нажатию Del Код: vbnet 1. 2. 3. 4. 5. 6. 7.
или авторCommidEdit() И надо найти как преобразовать Cell или Сендер в DataGridEditingUnit ваша проблема весьма любопытна, можете выложить проект и что именно надо ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2015, 14:58 |
|
Пустая запись в DataGridComboBoxColumn
|
|||
---|---|---|---|
#18+
mr Vap, Спасибо, но в c# нет CurrenItem. Итак, задача решается: 1. Создаем событие для ячейки. <DataGridComboBoxColumn x:Name="cbStatus" ClipboardContentBinding="{x:Null}" SelectedValueBinding="{Binding Status_id}" SelectedValuePath="Id" Header="Status" DisplayMemberPath="Name"> <DataGridComboBoxColumn.EditingElementStyle> <Style> <EventSetter Event="Control.PreviewKeyDown" Handler="cbStatus_PreviewKeyDown" /> </Style> </DataGridComboBoxColumn.EditingElementStyle> </DataGridComboBoxColumn> 2. В событии обрабатываем нажатие del За одно действие private void cbStatus_PreviewKeyDown(object sender, KeyEventArgs e) { if (e.Key==Key.Delete) { ((ComboBox)sender).SelectedItem = null; } } За два действия Обнуление DataGridCell DC = sender as DataGridCell; ((Table)DC.DataContext).Status_id=null; Или ((ComboBox)sender).SelectedItem = null; Обновление значения в ячейке Test_DB_Grid.CommitEdit((DataGridEditingUnit)sender,true); Подводный камень заключается в том, что если есть обработка del для DataGrid, то возможны конфликты (скачало вызывается, то, что для грида) Остался вопрос, как обратиться к ComboBox в DataGridTemplateColumn.CellTemplate ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2015, 19:34 |
|
|
start [/forum/topic.php?fid=21&msg=38884488&tid=1440920]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
176ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
others: | 265ms |
total: | 521ms |
0 / 0 |