Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/25: Рейтинг темы: голосов - 25, средняя оценка - 4.92
1 / 1 / 2
Регистрация: 18.12.2018
Сообщений: 149
1

Datagrid в WPF. Задать ячейке значение null

15.02.2019, 17:00. Показов 4659. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет! Ребят подскажите плз как мне удалить (не программно а просто тыкая мышкой и нажимая на что-то на клаве) из ячейки datagrid значение так чтоб оно превратилось в null а не в пустую строку. Тоесть мне надо чтоб ячейка была null а не ''.
Спасибо!

Добавлено через 4 часа 1 минуту
Тема не актуальна. Проблему решить средствами C# и WPF не удалось.... Написал триггер который ловит запрос UPDATE и проверяет какие поля заполнены и если заполнены неверными значениями меняет на null. Если кто столкнулся с проблемой пишите! Скину триггер в ответ как допишу)))
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.02.2019, 17:00
Ответы с готовыми решениями:

WPF, DataGrid и многострочие в ячейке
Как ясно из вопроса: есть DataGrid и текст в ячейках. Как сделать перенос текста внутри его? Везде...

WPF задать триггер стиля для всех ячеек DataGrid
в гриде несколько столбцов. нужно чтобы font color ячейки был серым если значение=0. можно указать...

Присвоить значение к конкретной ячейке Datagrid
Подскажите пожалуйста, как присвоить значение к конктретной ячейке datagrid? private void...

Проверка наличия значение не null в ячейке компонента dataGridView колонки типа ComboBox
Доброго времени суток. Имеется компонент dataGridView на котором один из столбцов представляет...

9
Модератор
Эксперт .NET
15470 / 10714 / 2788
Регистрация: 21.04.2018
Сообщений: 31,545
Записей в блоге: 2
16.02.2019, 00:41 2
Цитата Сообщение от Stas9700 Посмотреть сообщение
Тема не актуальна. Проблему решить средствами C# и WPF не удалось.... Написал триггер который ловит запрос UPDATE и проверяет какие поля заполнены и если заполнены неверными значениями меняет на null. Если кто столкнулся с проблемой пишите! Скину триггер в ответ как допишу)))
А триггер Вы писали вне WPF.... ?
Скиньте решение - интересно.
0
1 / 1 / 2
Регистрация: 18.12.2018
Сообщений: 149
16.02.2019, 12:00  [ТС] 3
Как и обещал вот мой вариант решения проблемы)
Начнем сначала с описания ситуации для полного понимания того чувства безысходности которое заставило меня выдумывать этот костыль.
Для хранения результатов обзвона клиентов и выяснения их мнения о компании где я работаю мне было поручено сделать БД на MS SQL и написать программу для занесения данных в БД. С задачей я благополучно справился и сделал вот такую табличку(см. вложения) для хранения всей информации.
Так как сотрудники обзванивающие клиентов в компуктерах не шарят я решил лишний раз подстраховаться и задал полям которые хранят ответы на вопросы тип float и прописал в БД ограничение CHECK так чтоб в эти колонки можно было записать число от 1 до 5
Кликните здесь для просмотра всего текста
(эта моя идея с типами данных и ограничением и сыграла со мной потом злую шутку)

Так же мной была написанна программа для администратора который бы мог править любое поле в табличке. Для написания ПО админа, я использовал datagrig и вот такой код:
Код для вывода информации из таблицы в datagrid
C#
1
2
3
4
5
6
7
8
9
private void UpdateDBGrid() //Обновление грида через SQLAdapter
        {
            string sql = "SELECT * FROM " + TBNam.TBName; // переписываем переменую для гарантии того что запрос верный
            FeedbackList = new DataTable(); //создаем новый объект DataTable
            SqlCommand command = new SqlCommand(sql, conn); //осуществляем подключение и передаем запрос
            adapter = new SqlDataAdapter(command); //создаем новый объект адаптера
            adapter.Fill(FeedbackList); //заливаем в таблицу данные из БД 
            dataGrid1.ItemsSource = FeedbackList.DefaultView; //ставим для грида источник объект таблицы
        }
Код для обновления информации в базе данных после того как администратор сделал все изменения
C#
1
2
3
4
5
6
7
8
9
10
11
12
private void UpdateData_Click(object sender, RoutedEventArgs e) //Обновление данных в БД 
        {
            try
            {
                SqlCommandBuilder comandbuilder = new SqlCommandBuilder(adapter); //автоматическое формирование запроса для обновления информации
                adapter.Update(FeedbackList); //обновляем данные в БД
            } catch (Exception er)
            {
                MessageBox.Show("Что-то пошло не так " + er);
            }
            
        }
Маленькое примечание - как вы могли заметить с паттерном MVVM я пока не до конца разобрался а в момент написания этой программы вообще не знал о нем практически ничего. Но есть внутренне ощущение что правильный для WPF подход меня не сильно бы спас ввиду проблем описанных ниже :-)

Проблема заключалась в том что поля формата даты и чисел в базе при загрузке в datagrid через SQLAdapter полностью поддерживает типизацию. Тоесть если у вас поле в БД имеет тип данных число то даже пустую строку вы в эту ячейку вписать не сможете. При попытке зайти в ячейку и кнопкой Backspace удалить все из ячейке то ее контур начинает гореть красным и все остальные ячейки блокируются.
Долгий и нудный поиск в гугле и яндексе ничего не дал и как выключить все эти проверки на тип я не понял (однако, допускаю что способ есть....).

А теперь к сладкому. Единственным возможным решением которое я смог найти оказалось написать непосредственно в БД триггер типа INSTEAD OF UPDATE. Триггер ловит любой запрос на обновление записей и благополучно проверяет какие поля в запросе пытаются обновить и что туда пытаются записать.
Вот он, величайший из всех моих костылей созданных при работе на этом проекте.
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
CREATE TRIGGER [dbo].[FieldAnaliser]
   ON [dbo].[FeedbackList]
   INSTEAD OF UPDATE
AS 
BEGIN 
    
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    DECLARE @P nvarchar(4), @OP nvarchar(10), @SQM nvarchar(10), @OW nvarchar(10), @SQI nvarchar(10), @TK nvarchar(10), @SQL nvarchar(10)
    -----------------------------------------------
    IF (UPDATE(WorkStart))
     BEGIN
    UPDATE FeedbackList SET WorkStart = inserted.WorkStart FROM inserted WHERE FeedbackList.ID = inserted.ID
    END
    -----------------------------------------------
    IF (UPDATE(Polltype))
     BEGIN
    UPDATE FeedbackList SET Polltype = inserted.Polltype FROM inserted WHERE FeedbackList.ID = inserted.ID
    END
    -----------------------------------------------
    IF (UPDATE(ClientName))
     BEGIN
    UPDATE FeedbackList SET ClientName = inserted.ClientName FROM inserted WHERE FeedbackList.ID = inserted.ID
    END 
    -----------------------------------------------
    IF (UPDATE(ClientContact))
     BEGIN
    UPDATE FeedbackList SET ClientContact = inserted.ClientContact FROM inserted WHERE FeedbackList.ID = inserted.ID
    END
    -----------------------------------------------
    IF (UPDATE(ProjectManager))
     BEGIN
    UPDATE FeedbackList SET ProjectManager = inserted.ProjectManager FROM inserted WHERE FeedbackList.ID = inserted.ID
    END 
    -----------------------------------------------
    IF (UPDATE(OutSpecHas))
     BEGIN
    UPDATE FeedbackList SET OutSpecHas = inserted.OutSpecHas FROM inserted WHERE FeedbackList.ID = inserted.ID
    END 
    -----------------------------------------------
    IF (UPDATE(ClientComment))
     BEGIN
    UPDATE FeedbackList SET ClientComment = inserted.ClientComment FROM inserted WHERE FeedbackList.ID = inserted.ID
    END 
    -----------------------------------------------
    IF (UPDATE(ServicesToClient))
     BEGIN
    UPDATE FeedbackList SET ServicesToClient = inserted.ServicesToClient FROM inserted WHERE FeedbackList.ID = inserted.ID
    END 
    -----------------------------------------------
    IF (UPDATE(Department))
     BEGIN
    UPDATE FeedbackList SET Department = inserted.Department FROM inserted WHERE FeedbackList.ID = inserted.ID
    END 
    -----------------------------------------------
    IF (UPDATE(CallDate))
     BEGIN
    UPDATE FeedbackList SET CallDate = inserted.CallDate FROM inserted WHERE FeedbackList.ID = inserted.ID
    END 
    -----------------------------------------------
    IF (UPDATE(PlusCall))
     BEGIN
    UPDATE FeedbackList SET PlusCall = inserted.PlusCall FROM inserted WHERE FeedbackList.ID = inserted.ID
    END 
    -----------------------------------------------
    IF (UPDATE(PlusCall))
     BEGIN
    UPDATE FeedbackList SET PlusCall = inserted.PlusCall FROM inserted WHERE FeedbackList.ID = inserted.ID
    END
    -----------------------------------------------
    IF (UPDATE(ObjectMark))
     BEGIN
    UPDATE FeedbackList SET ObjectMark = inserted.ObjectMark FROM inserted WHERE FeedbackList.ID = inserted.ID
    END
    -----------------------------------------------
    IF (UPDATE(Mark))
     BEGIN
    UPDATE FeedbackList SET Mark = inserted.Mark FROM inserted WHERE FeedbackList.ID = inserted.ID
    END 
    ----------------------------------------------
    IF (UPDATE(OutPlesure))
     BEGIN
       SELECT @OP = OutPlesure FROM inserted
       IF @OP = '1' OR @OP = '2' OR @OP = '3' OR @OP = '4' OR @OP = '5'
         BEGIN
           UPDATE FeedbackList SET OutPlesure = @OP FROM inserted WHERE FeedbackList.ID = inserted.ID
         END
       ELSE 
        BEGIN
         UPDATE FeedbackList SET OutPlesure = NULL FROM inserted WHERE FeedbackList.ID = inserted.ID
        END
     END
    ----------------------------------------------
    IF (UPDATE(ServiceQualityM))
     BEGIN
       SELECT @SQM = ServiceQualityM FROM inserted
       IF @SQM = '1' OR @SQM = '2' OR @SQM = '3' OR @SQM = '4' OR @SQM = '5'
         BEGIN
           UPDATE FeedbackList SET ServiceQualityM = @SQM FROM inserted WHERE FeedbackList.ID = inserted.ID
         END
       ELSE 
        BEGIN
         UPDATE FeedbackList SET ServiceQualityM = NULL FROM inserted WHERE FeedbackList.ID = inserted.ID
        END
     END
    -----------------------------------------------
    IF (UPDATE(InDeadlines))
     BEGIN
    UPDATE FeedbackList SET InDeadlines = inserted.InDeadlines FROM inserted WHERE FeedbackList.ID = inserted.ID
    END 
    ----------------------------------------------
    IF (UPDATE(OutWork))
     BEGIN
       SELECT @OW = OutPlesure FROM inserted
       IF @OW = '1' OR @OW = '2' OR @OW = '3' OR @OW = '4' OR @OW = '5'
         BEGIN
           UPDATE FeedbackList SET OutWork = @OW FROM inserted WHERE FeedbackList.ID = inserted.ID
         END
       ELSE 
        BEGIN
         UPDATE FeedbackList SET OutWork = NULL FROM inserted WHERE FeedbackList.ID = inserted.ID
        END
     END
    ----------------------------------------------
    IF (UPDATE(ServiceQualityI))
     BEGIN
       SELECT @SQI = ServiceQualityI FROM inserted
       IF @SQI  = '1' OR @SQI  = '2' OR @SQI  = '3' OR @SQI  = '4' OR @SQI  = '5'
         BEGIN
           UPDATE FeedbackList SET ServiceQualityI = @SQI  FROM inserted WHERE FeedbackList.ID = inserted.ID
         END
       ELSE 
        BEGIN
         UPDATE FeedbackList SET ServiceQualityI = NULL FROM inserted WHERE FeedbackList.ID = inserted.ID
        END
     END
    ----------------------------------------------
    IF (UPDATE(TakeMark))
     BEGIN
       SELECT @TK = TakeMark FROM inserted
       IF @TK  = '1' OR @TK  = '2' OR @TK  = '3' OR @TK  = '4' OR @TK  = '5'
         BEGIN
           UPDATE FeedbackList SET TakeMark = @TK  FROM inserted WHERE FeedbackList.ID = inserted.ID
         END
       ELSE 
        BEGIN
         UPDATE FeedbackList SET TakeMark = NULL FROM inserted WHERE FeedbackList.ID = inserted.ID
        END
     END
    ----------------------------------------------
    IF (UPDATE(ServiceQualityL))
     BEGIN
       SELECT @SQL = ServiceQualityL FROM inserted
       IF @SQL  = '1' OR @SQL = '2' OR @SQL  = '3' OR @SQL  = '4' OR @SQL  = '5'
         BEGIN
           UPDATE FeedbackList SET ServiceQualityL = @SQL  FROM inserted WHERE FeedbackList.ID = inserted.ID
         END
       ELSE 
        BEGIN
         UPDATE FeedbackList SET ServiceQualityL = NULL FROM inserted WHERE FeedbackList.ID = inserted.ID
        END
     END
    ----------------------------------------------
    IF (UPDATE(Proffesionalism))
    BEGIN
    SELECT @P = Proffesionalism FROM inserted
     IF @P = '1' OR @P = '2' OR @P = '3' OR @P = '4' OR @P = '5'
       BEGIN
        UPDATE FeedbackList SET Proffesionalism = @P FROM inserted WHERE FeedbackList.ID = inserted.ID
       END
     ELSE 
       BEGIN 
        UPDATE FeedbackList SET Proffesionalism = NULL FROM inserted WHERE FeedbackList.ID = inserted.ID
       END 
    END
    -----------------------------------------------
    IF (UPDATE(Feedback))
     BEGIN
     UPDATE FeedbackList SET Feedback = inserted.Feedback FROM inserted WHERE FeedbackList.ID = inserted.ID
     END
    -----------------------------------------------
    IF (UPDATE(FutureWork))
     BEGIN
     UPDATE FeedbackList SET FutureWork = inserted.FutureWork FROM inserted WHERE FeedbackList.ID = inserted.ID
     END
    -----------------------------------------------
    IF (UPDATE(QuestionComplain))
     BEGIN
     UPDATE FeedbackList SET QuestionComplain = inserted.QuestionComplain FROM inserted WHERE FeedbackList.ID = inserted.ID
     END
    -----------------------------------------------
    IF (UPDATE(OurAnswer))
     BEGIN
     UPDATE FeedbackList SET OurAnswer = inserted.OurAnswer FROM inserted WHERE FeedbackList.ID = inserted.ID
     END
    -----------------------------------------------
    IF (UPDATE(Spe******tBlame))
     BEGIN
     UPDATE FeedbackList SET Spe******tBlame = inserted.Spe******tBlame FROM inserted WHERE FeedbackList.ID = inserted.ID
     END
    -----------------------------------------------
    IF (UPDATE(OS))
     BEGIN
     UPDATE FeedbackList SET OS = inserted.OS FROM inserted WHERE FeedbackList.ID = inserted.ID
     END
    -----------------------------------------------
    IF (UPDATE(WeekNumber))
     BEGIN
     UPDATE FeedbackList SET WeekNumber = inserted.WeekNumber FROM inserted WHERE FeedbackList.ID = inserted.ID
     END
    -----------------------------------------------
    IF (UPDATE(NoteAuthorID))
     BEGIN
     UPDATE FeedbackList SET NoteAuthorID = inserted.NoteAuthorID FROM inserted WHERE FeedbackList.ID = inserted.ID
     END
    -- Insert statements for trigger here
END
Многие заметят то что я объявляю слишком много переменных но это вариант не финальный а просто рабочий. Далее его еще нужно оптимизировать но для понимания что и как он годится)

Мораль сей басни такова:
1. 1000 и 1 раз проверьте все ли нормально отрабатывается при записи из приложения в БД если в БД есть какие то ограничения или используется пестрая палитра типов данных.

2. Ни в коем случае не используйте этот способ если вашей БД будут пользоваться много человек. В моем случае штат небольшой и такой способ имеет право на жизнь....(с пособием по инвалидности)

3. Придумывайте какой то другой способ взаимодействия с БД из приложение но только не SQLAdapter и вот это все. Ужас и анал-пожар потом разбираться с тем как он там автоматически формирует запрос и какой в итоге запрос отсылается на сервер БД. Я честно пробовал делать через ObservableCollection как мне в какой то другой теме советовал Элд Хасп, но я так и не смог придумать способ как мне сгенерить запросы для обновления измененых ячеек. Единственное что я смог придумать это попытаться запихнуть отправку запроса на UPDATE в PropertyChanger (да да, INotifyPropertiChanged тоже использовал).
Поэтому для тех у кого таблицы в БД состоят исключительно из полей типа nvarchar/varchar/text да и любой строковый тип, использование SQLAdapter будет очень неплохим и быстрым способом, однако если вам нужно контролировать какие значения пытаются записать пользователи то откажитесь от этого варианта и мозгуйте другой способ. (Если не придумаете триггер вам в помощь ахаха)
Миниатюры
Datagrid в WPF. Задать ячейке значение null  
0
879 / 558 / 291
Регистрация: 21.11.2012
Сообщений: 1,553
18.02.2019, 11:22 4
все-таки нужно вам разбираться с mvvm + entityframework. намного проще и удобней.
0
1 / 1 / 2
Регистрация: 18.12.2018
Сообщений: 149
18.02.2019, 11:40  [ТС] 5
hamin, Согласен что надо, но пока времени нет, до конца с ним разобраться
0
879 / 558 / 291
Регистрация: 21.11.2012
Сообщений: 1,553
18.02.2019, 12:19 6
Stas9700,

вот в этой теме я показал имитацию работы с бд. Вернее там скорей показаны привязки и подход mvvm, сам же dbcontext там представляется другим классом, но в целом не сильно отличается от настоящих бд запросов
0
1 / 1 / 2
Регистрация: 18.12.2018
Сообщений: 149
18.02.2019, 12:31  [ТС] 7
hamin, Посмотрел тему, идея как аэвывести данные мне ясна а вот как записывать в БД измененный значения. Я к тому что когда пользователь меняет значение в ячейке дата грид, то как отправить запрос типа update dB set наше_поле where ацди_поля = такому то.... Или это все есть в Entity framework даёт такую возможность ?
0
879 / 558 / 291
Регистрация: 21.11.2012
Сообщений: 1,553
18.02.2019, 12:36 8
Лучший ответ Сообщение было отмечено Stas9700 как решение

Решение

Stas9700,

в энтити это автоматом реализовано. Как только изменяется какое-либо значение ячейки, контекст об этом знает.. т.е. вы меняете в датагриде, к примеру, значение ячейки и в вашей вьюмодели можно об этом узнать и вывести, к примеру, окно о сохранении данных.. типа того:

C#
1
2
3
4
5
6
if (myDbctx.ChangeTracker.HasChanges())
{
      var rep = dialogServices.ShowQuestion("Хотите сохранить изменения?");
      
      if (rep == true) myDbctx.SaveChanges();
}
у меня под рукой нет примера, буду дома- скину вам рабочий пример работы entityframework с sqllite бд. валяется дома один старенький проектик
0
1 / 1 / 2
Регистрация: 18.12.2018
Сообщений: 149
18.02.2019, 13:04  [ТС] 9
hamin, спасибо большое!!!
0
879 / 558 / 291
Регистрация: 21.11.2012
Сообщений: 1,553
19.02.2019, 22:51 10
Stas9700,

сюда не смог добавить, т.к. проект весит больше позволенных 20 метров, поэтому качайте отсюда

будут вопросы - задавайте
1
19.02.2019, 22:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.02.2019, 22:51
Помогаю со студенческими работами здесь

Получить значение ячейки datagrid wpf
Нужно при нажатии на ячейку получить ее значение, перепробовал кучу способов, ни один не сработал,...

Как задать активной ячейке значение?
Здравствуйте! Не подскажете как активной ячейке задать значение именно на языке Visual Basic? В...

Datagrid в ячейке Datagrid c корректным отображением границ
Задача поместить связанные данные (две таблицы Sql связаны по id ) в виде таблицы ячейки одной их...

Можно ли в определенной ячейке задать значение дата, которая будет постоянно изменяться в зависимости от даты на календаре
Подскажите, можно ли в Excel в определенной ячейке задать значение дата которая будет постоянно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru