powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Новая строка/запись в DataGridView. Ошибка.
22 сообщений из 22, страница 1 из 1
Новая строка/запись в DataGridView. Ошибка.
    #39036057
Agapov_stas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброго времени суток!
Есть код:
Код: vbnet
1.
2.
3.
4.
5.
Dim bs1 As New BindingSource
Dim bs2 As New BindingSource
Dim ds As New DataSet
Dim cmbTypeDevice As New DataGridViewComboBoxColumn
Dim cmbNameDevice As New DataGridViewComboBoxColumn



На Load() формы:
Код: vbnet
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.
connection.Open()
Dim da1 As New OleDbDataAdapter("Select TypeDevice,id From tblTypeDevice Order By TypeDevice", connection)
Dim da2 As New OleDbDataAdapter("Select nDevice,id,idTypeDevice From tblNameDevice Order By nDevice", connection)
da1.Fill(ds, "tblTypeDevice")
da2.Fill(ds, "tblNameDevice")

bs1.DataSource = ds
bs1.DataMember = "tblTypeDevice"

With cmbTypeDevice
     .HeaderText = "Тип прибора"
     .DataSource = bs1
     .DisplayMember = "TypeDevice"
     .ValueMember = "id"
End With

With cmbNameDevice
     .HeaderText = "Наименование прибора"
     .DisplayMember = "nDevice"
     .ValueMember = "id"
End With

With DataGridView1
     .Columns.Clear()
     .Columns.Add(cmbTypeDevice)
     .Columns.Add(cmbNameDevice)
End With


Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Private Sub DataGridView1_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged
        If e.RowIndex < 0 OrElse Not e.ColumnIndex = 0 Then
            Return
        Else
            If DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value > 0 Then
                bs2.DataSource = ds
                bs2.DataMember = "tblNameDevice"
                bs2.Filter = "idTypeDevice=" & DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value
                cmbNameDevice.DataSource = bs2
            End If
        End If
End Sub


В первой строке/записи датагрида значение выбирается и сохраняется нормально. Однако как только перейти на следующую строку/запись происходит ошибка(см. вложение). Точнее не когда переход на новую запись, а когда выбирается в первом комбо другой тип.
Мои действия:
1. Выбрал тип
2. Выбрал наименование
3. Перешел на след. строку
4. Выбрал другой тип
5. Выбираю наименование
6. Получил по морде ошибку


Как избавиться(исправить) от ошибки и почему возникает?
Спасибо.
...
Рейтинг: 0 / 0
Новая строка/запись в DataGridView. Ошибка.
    #39036472
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
не надо создавать привязку внутри DataGridView1_CellValueChanged
...
Рейтинг: 0 / 0
Новая строка/запись в DataGridView. Ошибка.
    #39039525
Agapov_stas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2не надо создавать привязку внутри DataGridView1_CellValueChanged
Cat2, спасибо что ответили.

Убрал привязку. Создал связь в dataset.
Вот как сейчас:
Код: vbnet
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.
            connection.Open()
            Dim da1 As New OleDbDataAdapter("Select TypeDevice,id From tblTypeDevice Order By TypeDevice", connection)
            Dim da2 As New OleDbDataAdapter("Select nDevice,id,idTypeDevice From tblNameDevice Order By nDevice", connection)
            da1.Fill(ds, "tblTypeDevice")
            da2.Fill(ds, "tblNameDevice")
            ds.Relations.Add("FKTypeName", ds.Tables(0).Columns("id"), ds.Tables(1).Columns("idTypeDevice"))

            With bs1
                .DataSource = ds
                .DataMember = "tblTypeDevice"
            End With
            With bs2
                .DataSource = bs1
                .DataMember = "FKTypeName"
            End With

            With cmbTypeDevice
                .HeaderText = "Тип прибора"
                .DataSource = bs1
                .DisplayMember = "TypeDevice"
                .ValueMember = "id"
            End With
            With cmbNameDevice
                .HeaderText = "Наименование прибора"
                .DisplayMember = "nDevice"
                .ValueMember = "id"
                .DataSource = bs2
            End With
            With DataGridView1
                .Columns.Clear()
                .Columns.Add(cmbTypeDevice)
                .Columns.Add(cmbNameDevice)
            End With


Ошибка та же.
...
Рейтинг: 0 / 0
Новая строка/запись в DataGridView. Ошибка.
    #39039646
Agapov_stas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не пойму, или так лень ответить, или реально никто не знает?
...
Рейтинг: 0 / 0
Новая строка/запись в DataGridView. Ошибка.
    #39041226
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Agapov_stas,

почему бы не почитать мсдн , там всё расжёвано с примерами
...
Рейтинг: 0 / 0
Новая строка/запись в DataGridView. Ошибка.
    #39042002
Agapov_stas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pation, спасибо за ответ.
Вы сами-то читали? Там ни слова про bindingSource(я та понимаю мне именно его использовать нужно).
Кроме того, как по мне, очень много действий, как для "каскадных комбобоксов".

Пример может хоть кто-нибудь приложить? Или еще лучше, объяснить почему выскакивает ошибка(см. пред. мой пост), ведь аналогичное работает на основной форме.

Спасибо.
...
Рейтинг: 0 / 0
Новая строка/запись в DataGridView. Ошибка.
    #39042176
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Agapov_stas,


Вам же программа ясно написала, что надо обработать ошибку в DataError. В большинстве случаев и обрабатывать ничего не надо. Просто создайте привяжите этот обработчик к гриду. А уж потом, если хочется, посмотрите какая ошибка прилетает и почему появилось "недопустимое значение" и исправьте ошибку.
...
Рейтинг: 0 / 0
Новая строка/запись в DataGridView. Ошибка.
    #39042644
Agapov_stas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2, спасибо, что "вернулись".

Код: vbnet
1.
2.
3.
Private Sub DataGridView1_DataError(ByVal sender As Object, ByVal e As DataGridViewDataErrorEventArgs) Handles DataGridView1.DataError
MessageBox.Show(e.Context.ToString())
End Sub


После чего отображается месседж(см. вложение).
...
Рейтинг: 0 / 0
Новая строка/запись в DataGridView. Ошибка.
    #39042646
Agapov_stas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После нажатия на "ОК".
...
Рейтинг: 0 / 0
Новая строка/запись в DataGridView. Ошибка.
    #39042649
Agapov_stas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е., в первой строке пропадает значение..
...
Рейтинг: 0 / 0
Новая строка/запись в DataGridView. Ошибка.
    #39042679
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Agapov_stas,
Ну вот. Сразу видно, чо грид не может показать существующее значение в отформатированном виде.

При переходе к второй строке в первой строке из-за установки фильтра на bs2 нет значения, которое должно быть отображено.

Попробуйте так

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Private Sub DataGridView1_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged
        If (всякие условия что грид пустой или в процессе создания или заполнения) Then
            Return
        Else
            If (e.ColumnIndex  = (тут индекс колонки "тип прибора")  Then
                bs2.Filter = "idTypeDevice=" & DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value
            End If
            If (e.ColumnIndex = (тут индекс колонки "название прибора")  Then
                bs2.Filter = ""
            End If
        End If
End Sub
...
Рейтинг: 0 / 0
Новая строка/запись в DataGridView. Ошибка.
    #39043080
Agapov_stas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2, все та же ошибка.
Просто открываю форму и в первой строке пропадает значение, а во второй нормально.
Думал, что играет роль свойство " DataPropertyName ", так нет. Убрал его из обоих комбо, все равно то же самое происходит. Кстати, если убрать " DataPropertyName " у комбо, то ошибка происходит в момент создания новой строки/записи в гриде.

И еще вопросик, а почему фильтр BindingSource -а?Ведь смысл тогда в Relations , который я указал для таблиц?
...
Рейтинг: 0 / 0
Новая строка/запись в DataGridView. Ошибка.
    #39043113
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Agapov_stasИ еще вопросик, а почему фильтр BindingSource -а?Ведь смысл тогда в Relations , который я указал для таблиц?
Уберите немедленно!
Если предполагается, что значение будет в гридовском комбобоксе, то Relations просто вредна!

Смысл фильтра в том, что бы в наименованиях показывать только те пункты, которые соответствуют типу.
...
Рейтинг: 0 / 0
Новая строка/запись в DataGridView. Ошибка.
    #39043547
igr_ok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Agapov_stas,

У вас один источник данных для всего столбца. Когда вы применяете фильтр к нему, что произойдет с записями, которые не входят в фильтр? Их значения будут пустыми.
...
Рейтинг: 0 / 0
Новая строка/запись в DataGridView. Ошибка.
    #39043913
Agapov_stas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igr_okУ вас один источник данных для всего столбца. Когда вы применяете фильтр к нему, что произойдет с записями, которые не входят в фильтр? Их значения будут пустыми.
Вы хотите совет дать или просто констатировать факт?
...
Рейтинг: 0 / 0
Новая строка/запись в DataGridView. Ошибка.
    #39043960
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Agapov_stas,
Вы уже убрали Relations?
================
gr_ok совершенно точно сразу определил причину ошибки. Решить, как ее обойти - Ваше дело. Вы же программист?
...
Рейтинг: 0 / 0
Новая строка/запись в DataGridView. Ошибка.
    #39043978
igr_ok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Agapov_stasigr_okУ вас один источник данных для всего столбца. Когда вы применяете фильтр к нему, что произойдет с записями, которые не входят в фильтр? Их значения будут пустыми.
Вы хотите совет дать или просто констатировать факт?Если бы причина ошибки была для вас очевидна-ошибка бы вообще не возникла.
Совет-применять фильтр после того, как пользователь кликает по ячейке 2-го столбца, перед отображением выпадающего списка. И после выбора пользователя фильтр сразу убирать.
...
Рейтинг: 0 / 0
Новая строка/запись в DataGridView. Ошибка.
    #39044399
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
смотрю на вот это все с какой то грустью...
у нас на заводе под 100 таких вот отчетов и прочего написано кем-то.
читабельность нулевая ... часто писалось в течение 1-2-3 дней.
оперейшенс привык уже этим пользоваться ... а оно переодически все летит...
народ кто писал уже давным давно уволился и что делать с этим всем не понятно.

У менеджмента в головах уже начинает проскакивать мысль что лучше бы этого и не было...
По началу работу ускоряет ... а затем оперейшнс теряет экспертизу и когда такое чудо ломается особливо в закрытие месяца / финансового года ... начинаются разборки и поиск крайних.
...
Рейтинг: 0 / 0
Новая строка/запись в DataGridView. Ошибка.
    #39044550
Agapov_stas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Agapov_stas,
Вы уже убрали Relations?
================
gr_ok совершенно точно сразу определил причину ошибки. Решить, как ее обойти - Ваше дело. Вы же программист?
Да, relations убрал , выше в постах все детально расписывал, с кодом и скринами, видимо Вы не увидели.
Если бы знал как ее обойти в VS правильно , не задавал бы вопрос в спец. ветке форуме. Но, судя по советам, "ты же прогер, сам и найди решение", ответы "достойны" уважения. (собственно при поиске моего вопроса в этой ветке форума, 75% ответов(если таковые имелись вообще) - это как раз "гугл в помощь". Вот ищи, называется, ответ, когда нет его как такового.)
P.S. Сначала Вы посоветовали убрать привязку в событии CellValueChanged грида, после чего сказали добавить последнее...Хм..

igr_okЕсли бы причина ошибки была для вас очевидна-ошибка бы вообще не возникла.
Совет-применять фильтр после того, как пользователь кликает по ячейке 2-го столбца, перед отображением выпадающего списка. И после выбора пользователя фильтр сразу убирать.
Если Вы считаете причиной - "У вас один источник данных для всего столбца", то я удивлен, что такое происходит. Ввиду того, что до "перехода" на VS, работал в MS Access, проблем не было с подобными вещами. И я сильно сомневаюсь, что в такой-то среде и такие "запарки". А тут наткнулся. Потому вопрос и задан. Не думал, что такие "колеса" могут возникнуть, с простыми манипуляциями.
Ну да ладно, спасибо за советы, примем к сведению.

To Артем G, вот чтобы не было "криворукости" и нужно делать все изначально правильно.Потому вопросы и задаются, чтобы более опытные подсказали начинающим. Делов опытному - пару минут. Но это не к Вам, Вы же философ, а не...
Спасибо.
...
Рейтинг: 0 / 0
Новая строка/запись в DataGridView. Ошибка.
    #39044556
Agapov_stas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пы.Сы. Ссыль на сообщение ошибочна. Но relations был убран сразу после замечания.
...
Рейтинг: 0 / 0
Новая строка/запись в DataGridView. Ошибка.
    #39044560
Agapov_stas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igr_ok , на какие событие вешать код фильтра/отмены фильтра bindingsource?
DataGridView1_CellClick и DataGridView1_CellLeave ?
...
Рейтинг: 0 / 0
Новая строка/запись в DataGridView. Ошибка.
    #39044565
Agapov_stas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igr_ok , верный ли будет такой вариант?:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
 Private Sub DataGridView1_CellBeginEdit(sender As Object, e As DataGridViewCellCancelEventArgs) Handles DataGridView1.CellBeginEdit
        Dim i As Integer = DataGridView1.CurrentCell.ColumnIndex
        Try
            If e.RowIndex < 0 OrElse Not e.ColumnIndex = 0 Then
                Select Case i
                    Case 9
                        If Not IsDBNull(DataGridView1.CurrentCell.Value) Then
                            bsNameDevice.Filter = "idTypeDevice=" & DataGridView1.CurrentRow.Cells(9).Value & ""
                        End If
                    Case 10
                        bsNameDevice.Filter = "idTypeDevice=" & DataGridView1.CurrentRow.Cells(9).Value & ""
                    Case Else
                        bsNameDevice.Filter = ""
                End Select
            Else
                bsNameDevice.Filter = ""
            End If
        Catch ex As Exception
            MsgBox(ex.Message.ToString())
        End Try
    End Sub
    Private Sub DataGridView1_CellEndEdit(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit
        bsNameDevice.Filter = ""
    End Sub


Вроде, отрабатывает.

Спасибо.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Новая строка/запись в DataGridView. Ошибка.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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