powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Пустая запись в DataGridComboBoxColumn
25 сообщений из 26, страница 1 из 2
Пустая запись в DataGridComboBoxColumn
    #38884488
UncleJo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дано: Имеется 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. Но как определить какая ячейка редактируется или выделена вся строка, а не ячейка?

Кто какими способами пользовался? Какой предпочтительней?
...
Рейтинг: 0 / 0
Пустая запись в DataGridComboBoxColumn
    #38884693
UncleJo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UncleJo,

UPD по пункту 2. Добавить обработчик можно, но он вызывается после аналогичного обработчика для ДатаГрида.


Встает вопрос: Как определить какая ячейка редактируется ячейка при нажатии Del клавиши (выделение разрешено только по строкам)?
По идее это должно как-то определяться в коллекции SelectedCells.
...
Рейтинг: 0 / 0
Пустая запись в DataGridComboBoxColumn
    #38884717
Ilya81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UncleJoМожно ли его добавить к DataGridComboBoxColumn и не будет ли он конфликтовать с аналогичным обработчиком DataGrid.
Если нажатие должно распространяться только на ComboBox, то нужно его handle'ить.
UncleJoДобавить обработчик можно, но он вызывается после аналогичного обработчика для ДатаГрида.
Странно. Попробуйте preview-событие. Handle'ить аналогично.
...
Рейтинг: 0 / 0
Пустая запись в DataGridComboBoxColumn
    #38884745
UncleJo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ilya81, Пардон, а что значит handle'ить?

Тут еще образовался вопрос, как присвоить значение DataGridComboBoxColumn програмно?
ComboBox позволяет присвоить SelectedItem=null; Здесь такого свойства нет.
...
Рейтинг: 0 / 0
Пустая запись в DataGridComboBoxColumn
    #38884818
Ilya81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь написано . Но если смысл этого свойства не понятен, рекомендую разобраться, ибо это весьма существенный момент пользовательского интерфейса на WPF (не говоря уж о том, что аналогичные методы применяются не только в WPF).
UncleJoТут еще образовался вопрос, как присвоить значение DataGridComboBoxColumn програмно?
ComboBox позволяет присвоить SelectedItem=null; Здесь такого свойства нет.
Используйте SelectedItemBinding. Кстати, вместо события можно использовать InputBindings, команды всегда handle'ят собития.
...
Рейтинг: 0 / 0
Пустая запись в DataGridComboBoxColumn
    #38884910
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
могу ошибаться, но на сколько я помню SelectionIndex = -1 снимает выделение с комбика
...
Рейтинг: 0 / 0
Пустая запись в DataGridComboBoxColumn
    #38885063
UncleJo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ilya81, спасибо/ обязательно прочитаю. Как вариант может помочь.. SelectedItemBinding=null не работает. SelectionIndex = нет такого свойства.
...
Рейтинг: 0 / 0
Пустая запись в DataGridComboBoxColumn
    #38885077
Ilya81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SelectedItemBinding надо не null присваивать, а ставить binding (желательно на view model) и через него задавать SelectedItem.
...
Рейтинг: 0 / 0
Пустая запись в DataGridComboBoxColumn
    #38885168
UncleJo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ilya81, Вот тут я и сел в лужу. Пошел учить теорию.

Сейчас прорабатываю вариант использования Sender из обработчика. Но Там так же DataContext не строка.
...
Рейтинг: 0 / 0
Пустая запись в DataGridComboBoxColumn
    #38885187
UncleJo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UncleJo,

Сработал такой вариант:
DataGridCell DC = sender as DataGridCell;
((tbl_infrastructure_projects)DC.DataContext).highway_id = null;

Но обновление Ячейки происходит только после потери фокуса. Надо с DataGridCombobox работать.
...
Рейтинг: 0 / 0
Пустая запись в DataGridComboBoxColumn
    #38885216
Ilya81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть ещё такое свойство - позволяет обновлять по изменению значений свойств. А так, обычно я использую MVVM , для обработки нажатия клавиш через него InputBindings .
...
Рейтинг: 0 / 0
Пустая запись в DataGridComboBoxColumn
    #38885250
UncleJo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ilya81,
Я думаю, это не верный путь. Лучше присвоить значение datagridcomboboxcolumn из кода сразу. Имя его известно. Остается понять как ему присвоить значение.

Совсем не понял: SelectedItemBinding надо не null присваивать, а ставить binding (желательно на view model) и через него задавать SelectedItem.
...
Рейтинг: 0 / 0
Пустая запись в DataGridComboBoxColumn
    #38885260
Ilya81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UncleJoСовсем не понял: SelectedItemBinding надо не null присваивать, а ставить binding (желательно на view model) и через него задавать SelectedItem.
Это про вариант с MVVM. Можно создать binding и в коде (хотя, я такие методы не практикую), проще всего, мне кажется всё равно так или иначе использовать интерфейс INotifyPropertyChanged.

Есть ещё вариант найти ComboBox с помощью VisualTreeHelper и выставить его свойства напрямую, но по мне это совсем кривой вариант. DataGrid всё ж больше ориентирован на MVVM.
...
Рейтинг: 0 / 0
Пустая запись в DataGridComboBoxColumn
    #38885267
UncleJo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ilya81,

А зачем его искать. есть ссылка на DataGridCell в Сендере. У него есть название highway_id Тип (DataGridComboboxcolumn).

Попутно нашел еще один вариант обнуления:

((tbl_infrastructure_projects)List_tbl_infrastructure_projects.SelectedItem).highway_id = null ;
Но у него такая же беда. Мне\ет непосредственно значения в DataGrid, но не меняется DataGridComboboxcolumn

Конечно можно использовать обработку события, если источник изменился изменить DataGridComboboxcolumn. Но мне видится правильным просто поменять значение SelectedItem будет правильней. Блин, но как к нему добраться!
...
Рейтинг: 0 / 0
Пустая запись в DataGridComboBoxColumn
    #38885286
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UncleJo,

правильно, это использования связывания, а не страдание фигнёй, как говорит Ilya81, это как фундамент в WPF, без связывания всё это не имеет ни какого смысла.
кстати, есть еще класс DataGridBoundColumn, с помощью наследования в нём можно переопределить всё как вашей душе угодно. Начиная от внешнего вида ячеек и заканчивая их поведением.
...
Рейтинг: 0 / 0
Пустая запись в DataGridComboBoxColumn
    #38885291
UncleJo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 остается старое значение, пока ячейка не выйдет из состояния редактирования)
...
Рейтинг: 0 / 0
Пустая запись в DataGridComboBoxColumn
    #38885296
Ilya81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UncleJoА зачем его искать. есть ссылка на DataGridCell в Сендере. У него есть название highway_id Тип (DataGridComboboxcolumn).
...
Но мне видится правильным просто поменять значение SelectedItem будет правильней. Блин, но как к нему добраться!
У DataGridComboBoxColumn нет никакого SelectedItem, а DataGridColumn наследуется от DependencyObject (т. е. не является UIElement). У него есть метод GenerateElement, в котором DataGridComboBoxColumn создаёт ComboBox, который, в отличие от DataGridComboBoxColumn наследуется от класса Selector и содержит в иерархии наследования классы Control и UIElement. Есть доступ к его свойствам через стили в свойствах ElementStyle и EditingElementStyle, но они обращаются к template, а не к экземпляру ComboBox. SelectedItem возможно выставить только у самого ComboBox.
...
Рейтинг: 0 / 0
Пустая запись в DataGridComboBoxColumn
    #38885299
UncleJo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ilya81,
Получается, что напрямую задать значение нельзя?
Может тогда перейти с DataGridComboBoxColumn на ComboBox?
...
Рейтинг: 0 / 0
Пустая запись в DataGridComboBoxColumn
    #38885302
Ilya81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UncleJoIlya81,
Получается, что напрямую задать значение нельзя?
Может тогда перейти с DataGridComboBoxColumn на ComboBox?
Во варианте MVVM легко. Через обработчики событий - можно через VisualTreeHelper найти ComboBox, хотя сам я такие методы не практикую.
...
Рейтинг: 0 / 0
Пустая запись в DataGridComboBoxColumn
    #38885347
UncleJo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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, а дальше не понятно.
...
Рейтинг: 0 / 0
Пустая запись в DataGridComboBoxColumn
    #38885491
mr Vap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
datagrid.Items(0)(0) = DBNull.Value
DirectCast(datagrid.Items(0), DataRowView).EndEdit()


старайтесь пользоваться MVVM - надежнее
...
Рейтинг: 0 / 0
Пустая запись в DataGridComboBoxColumn
    #38885507
UncleJo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mr Vap,

Идея хорошая. Только CommidEdit() И надо найти как преобразовать Cell или Сендер в DataGridEditingUnit
...
Рейтинг: 0 / 0
Пустая запись в DataGridComboBoxColumn
    #38885644
mr Vap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
 Private Sub dg_PreviewKeyUp(sender As Object, e As System.Windows.Input.KeyEventArgs) Handles dg.PreviewKeyUp
        If e.Key = Key.Delete Then
            If Me.dg.CurrentColumn.GetType Is GetType(DataGridComboBoxColumn) Then
                Me.dg.CurrentItem = DBNull.Value
            End If
        End If
    End Sub


или

авторCommidEdit() И надо найти как преобразовать Cell или Сендер в DataGridEditingUnit

ваша проблема весьма любопытна, можете выложить проект и что именно надо
...
Рейтинг: 0 / 0
Пустая запись в DataGridComboBoxColumn
    #38885721
UncleJo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Пустая запись в DataGridComboBoxColumn
    #38885765
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UncleJo,

нужно просто включить мозг и осознать тот факт, что событийная модель тут не подходит, это не WF, используйте шаблон MVVM и все ваши проблемы рухнут в тот же миг.
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Пустая запись в DataGridComboBoxColumn
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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