Модераторы: diadiavova, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка обращения к DataGridView, из дочерней формы 
:(
    Опции темы
ServanteS21
Дата 29.4.2014, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 29.4.2014

Репутация: нет
Всего: нет



Здравствуйте, столкнулся с проблемой при редактировании значения DataGrid, находящегося в Form1 из Form 2

Form1 (sprbk):
Код

Private Sub edtbtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles edtbtn.Click
        Dim edt As New edtbk()
        'Set the Parent Form of the Child window.
        edt.MdiParent = main
        'Внесение значений из датагрида в поля формы edtbk
        edt.nmtxtbx.Text = DirectCast(BooksDataGridView.CurrentRow.Cells(2).Value, String)
        edt.crtdttm.Value = DirectCast(BooksDataGridView.CurrentRow.Cells(1).Value, Date)
        'Display the new form.
        edt.Show()
    End Sub


Form2(edtbk):
Код

Private Sub okbtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles okbtn.Click
       
        'Внесение изменений в таблицу
        sprbk.BooksDataGridView.CurrentRow.Cells(2).Value = nmtxtbx.Text
        sprbk.BooksDataGridView.CurrentRow.Cells(1).Value = crtdttm.Value
 
        'Проверка введенных данных и сохранение изменений
        Me.Validate()
        Me.BooksBindingSource.EndEdit()
        Me.TableAdapterManager.UpdateAll(Me.DipDataSet)
 
        'Закрытие формы
        Me.Close()
    End Sub


Компилируется, но при нажатии на ОК в форме редактирования (Form2) выдает ошибку "ссылка на объект не указывает на экземпляр объекта"

Проблема точно в 4 и 5 строках дочерней формы, но как сделать правильно, я не знаю.

PS: Простите быдлокодера, ну очень нужно... 

Это сообщение отредактировал(а) ServanteS21 - 29.4.2014, 18:28
PM MAIL   Вверх
diadiavova
Дата 29.4.2014, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



ServanteS21, я правильно понимаю, вторая форма выполняет просто роль редактора каких-то значений первой, то есть диалогового окна? Если так, то просто ознакомься с тем как работают стандартные диалоговые окна и сделай так же. В твоем случае мне сложно сказать в чем проблема, например не очень понятно что такое sprbk и как оно инициируется. Точнее понятно, что по идее это должна быть ссылка на первую форму, но как ты ее туда передаешь - из твоего фрагмента кода не видно. А вообще, как правило это плохая идея воздействовать из одной формы на другую. Все-таки ознакомься с тем, как действуют стандартные диалоговые окна. Они вообще не имеют никакой информации о вызывавшем их окне, тем не менее со своей задачей вполне справляются.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
ServanteS21
Дата 29.4.2014, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 29.4.2014

Репутация: нет
Всего: нет



Да, вторая форма выполняет роль редактора, она необходима, так как в DataGrid отображаются не все поля, а только поля, необходимые для идентификации строки, для дальнейшего её редактирования. 

sprbk - это родительская форма относительно edtbk. Как она инициируется не важно, но вот на всякий случай:

Это все в main форме, которая является mdi контейнером:
Код

Private Sub КнигиToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles КнигиToolStripMenuItem.Click
        Dim bk As New sprbk()
        'Set the Parent Form of the Child window.
        bk.MdiParent = Me
        'Display the new form.
        bk.Show()
    End Sub


Диалоговым окном можно объявить созданную мной форму?

Это сообщение отредактировал(а) ServanteS21 - 29.4.2014, 20:05
PM MAIL   Вверх
diadiavova
Дата 29.4.2014, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Цитата(ServanteS21 @  29.4.2014,  21:04 Найти цитируемый пост)
Как она инициируется не важно

Я привел пример того, какая информация отсутствует, но может повлиять на описанную проблему. Полагаю, если бы ты знал, что важно, а что нет, то мог бы и сам решить свою проблему, но судя по всему это не так.
Первое что тебе нужно определить в ситуации когда вылетает подобное исключение - это какая именно переменная не инициированна. Ты этого не указал, поэтому я обратил твое внимание на наиболее вероятную ошибку. Возможно дело в другой переменной, так что запускай отладку и когда вылетит исключение, проверь какой именно объект отсутствует.

Цитата(ServanteS21 @  29.4.2014,  21:04 Найти цитируемый пост)
sprbk - это родительская форма относительно edtbk. 

Я спросил не об этом. Я понимаю, что имеется в виду форма. Но ты ссылаешься на некую переменную с таким именем, вот я и спрашивю, в каком месте этой переменной присвоен объект формы.
Цитата(ServanteS21 @  29.4.2014,  21:04 Найти цитируемый пост)
Диалоговым окном можно объявить созданную мной форму?

Да, но для того, чтобы она работала как обычный диалого ее надо малость переделать. Стандартный диалог может получить какие-то данные и отобразить их или может ничего не получить, а создать новый экземпляр данных - это не важно. Получает он данные путем присвоения какому-то его свойству объекта, содержащего эти данные. В результате редактирования свойство с данными будет уже возвращать отредактированные данные и все. 

Для того, чтобы запустить форму в режиме модального диалога, надо вызвать метод ShowDialog вместо Show. Этот метод возвращает экземпляр перечисления DialogResult. Тебе надо в обработчике ОК присвоить свойству формы DialogResult нужное значение (форма закроется автоматически), для Cancel надо сделать то же самое, только присвоить другое значение. 

ShowDialog возвратит именно то значение, которое будет присвоено форме при закрытии. Дальше в If проверяешь, что ShowDialog возвратил OK и извлекаешь из диалога все необходимые данные из свойства, специально для этого созданного. То есть вместо того, чтобы из формы2 воздействовать на форму1, ты все эти действия выполняешь в форме1(извлекаешь данные и присваиваешь нужным полям). Ну как-то так. Если объяснение показалось путанным, то почитай в документации о работе с диалогами, а потом вернись и перечитай написанное.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
ServanteS21
Дата 29.4.2014, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 29.4.2014

Репутация: нет
Всего: нет



Цитата
Я привел пример того, какая информация отсутствует, но может повлиять на описанную проблему. Полагаю, если бы ты знал, что важно, а что нет, то мог бы и сам решить свою проблему, но судя по всему это не так.

Дядь, извините мальчонку дерзкого, но ведь действительно не в этом дело...

Цитата
Первое что тебе нужно определить в ситуации когда вылетает подобное исключение - это какая именно переменная не инициированна. Ты этого не указал, поэтому я обратил твое внимание на наиболее вероятную ошибку. Возможно дело в другой переменной, так что запускай отладку и когда вылетит исключение, проверь какой именно объект отсутствует.

А вот тут пришло мое время удивляться, я-ж ###кодер, я не умею, а время жмет капец как... Можно поподробнее об этом процессе?

Цитата
Я спросил не об этом. Я понимаю, что имеется в виду форма. Но ты ссылаешься на некую переменную с таким именем, вот я и спрашивю, в каком месте этой переменной присвоен объект формы.

Понял, я так понимаю, ответ получен?

Цитата
Да, но для того, чтобы она работала как обычный диалого ее надо малость переделать. Стандартный диалог может получить какие-то данные и отобразить их или может ничего не получить, а создать новый экземпляр данных - это не важно. Получает он данные путем присвоения какому-то его свойству объекта, содержащего эти данные. В результате редактирования свойство с данными будет уже возвращать отредактированные данные и все. 

Для того, чтобы запустить форму в режиме модального диалога, надо вызвать метод ShowDialog вместо Show. Этот метод возвращает экземпляр перечисления DialogResult. Тебе надо в обработчике ОК присвоить свойству формы DialogResult нужное значение (форма закроется автоматически), для Cancel надо сделать то же самое, только присвоить другое значение. 

ShowDialog возвратит именно то значение, которое будет присвоено форме при закрытии. Дальше в If проверяешь, что ShowDialog возвратил OK и извлекаешь из диалога все необходимые данные из свойства, специально для этого созданного. То есть вместо того, чтобы из формы2 воздействовать на форму1, ты все эти действия выполняешь в форме1(извлекаешь данные и присваиваешь нужным полям). Ну как-то так. Если объяснение показалось путанным, то почитай в документации о работе с диалогами, а потом вернись и перечитай написанное.

О гак... Вроде всё понял, но вот беда: с синтаксисом у меня бядааа...

Такой вопрос: "Вы спать не планируете пока? Можно с Вами в скайпе пообщаться? А то я практически решил задачу. только вот вопрос возник небольшой, об который уже часа полтора долблюся...
PM MAIL   Вверх
diadiavova
Дата 29.4.2014, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Цитата(ServanteS21 @  29.4.2014,  22:06 Найти цитируемый пост)
Можно поподробнее об этом процессе?

Ну начать можно отсюда
http://msdn.microsoft.com/ru-ru/library/awtaffxb.aspx
Например с такого пошагового руководства
http://msdn.microsoft.com/ru-ru/library/kya29xtx.aspx

Добавлено через 1 минуту и 39 секунд
Цитата(ServanteS21 @  29.4.2014,  22:06 Найти цитируемый пост)
Понял, я так понимаю, ответ получен?

Ну это тебе виднее. Но ошибка, которую ты упомянул всегда появляется именно когда ты обращаешься к неинициированной переменной, свойству и т.д.

Добавлено через 7 минут и 13 секунд
Цитата(ServanteS21 @  29.4.2014,  22:06 Найти цитируемый пост)
О гак... Вроде всё понял, но вот беда: с синтаксисом у меня бядааа...

По диалоговым окнам вот раздел
http://msdn.microsoft.com/ru-ru/library/2c...=vs.110%29.aspx
Видимо все там. К примеру начни отсюда (просмотрел мельком, но вроде то что надо)
http://msdn.microsoft.com/ru-ru/library/ca...=vs.110%29.aspx

Добавлено через 7 минут и 53 секунды
Цитата(ServanteS21 @  29.4.2014,  22:06 Найти цитируемый пост)
Можно с Вами в скайпе пообщаться?

 smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
ServanteS21
Дата 29.4.2014, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 29.4.2014

Репутация: нет
Всего: нет



Спасибо.
PM MAIL   Вверх
ServanteS21
Дата 30.4.2014, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 29.4.2014

Репутация: нет
Всего: нет



Обновлю, не понял я где я должен объявить TextBox и зачем, также не очень понял, зачем мне объявлять CurrentRow существующего DataGrid (что может оказаться необъявленным в "sprbk.BooksDataGridView.CurrentRow.Cells(1).Value = crtdttm.Value"), но решил уйти от CurrentRow и сделал следующее:

Объявил глобальную переменную:
Код

Public iRowNumber As Integer


Создал процедуру в Form1, осознал, что так правильнее:
Код

Public Sub Editbkpr(ByVal value1 As String, ByVal value2 As Date)
        BooksDataGridView.Rows(main.iRowNumber).Cells(2).Value = value1
        BooksDataGridView.Rows(main.iRowNumber).Cells(1).Value = value2
    End Sub


И, соответственно вызвал ее в Form2:
Код

Private Sub okbtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles okbtn.Click
        'Внесение изменений в таблицу
        sprbk.Editbkpr(nmtxtbx.Text, crtdttm.Value)

        'Проверка введенных данных и сохранение изменений
        Me.Validate()
        Me.BooksBindingSource.EndEdit()
        Me.TableAdapterManager.UpdateAll(Me.DipDataSet)

        'Закрытие формы
        Me.Close()
    End Sub


Собственно, теперь выдает ошибку "Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции. Имя параметра: index"

Проверял дэбагом, main.iRowNumber получает значение индекса строки, но вот параметр Rows в "BooksDataGridView.Rows(main.iRowNumber).Cells(2).Value = value1" его принимать отказывается.
Подскажите, пожалуйста, в чем может быть проблема? и переменную какого типа тогда использовать для хранения индекса строки датагрида?
PM MAIL   Вверх
diadiavova
Дата 30.4.2014, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Цитата(ServanteS21 @  30.4.2014,  19:04 Найти цитируемый пост)
 не понял я где я должен объявить TextBox и зачем, также не очень понял, зачем мне объявлять CurrentRow существующего DataGrid

Я тоже этого не понял. Вопрос видимо следует адресовать тому, кто дал тебе такой совет (это был точно не я). Я только спросил, где объявляется переменная, хранящая ссылку на вызывающую форму и как эта переменная инициируется.
Кроме того я написал, что тебе следует выяснить с помощью отладчика какая именно переменная не содержит ссылку на объект. Очень сложно дать какой-то совет, когда отсутсвуют важные данные. Видимо ты забываешь о том, что я знаю о твоем приложении ровно то, что ты сообщил и не вижу всей картины.
Цитата(ServanteS21 @  30.4.2014,  19:04 Найти цитируемый пост)
Подскажите, пожалуйста, в чем может быть проблема? и переменную какого типа тогда использовать для хранения индекса строки датагрида? 

Опять-таки всей картины нет, поэтому можно только предположить, исходя из того, какие ошибки наиболее часто допускают новички. Например следует задать тебе вопрос, не забыл ли ты о том, что индексация начинается с нуля и таким образом индекс последнего элемента всегда на единицу меньше общего их количества. То есть если у тебя пять строк, то индекс последней будет 4, а попытка обратиться к элементу с индексом 5 вызовет то самое исключение. Кроме того обрати внимание на то, что индексируются у тебя не только  строки, но и ячейки и убедись, что исключение вызывают не они. Но вообще, в отладчике можно получить всю информацию.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
ServanteS21
Дата 2.5.2014, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 29.4.2014

Репутация: нет
Всего: нет



Цитата(diadiavova @ 30.4.2014,  21:30)
Опять-таки всей картины нет, поэтому можно только предположить, исходя из того, какие ошибки наиболее часто допускают новички. Например следует задать тебе вопрос, не забыл ли ты о том, что индексация начинается с нуля и таким образом индекс последнего элемента всегда на единицу меньше общего их количества. То есть если у тебя пять строк, то индекс последней будет 4, а попытка обратиться к элементу с индексом 5 вызовет то самое исключение. Кроме того обрати внимание на то, что индексируются у тебя не только  строки, но и ячейки и убедись, что исключение вызывают не они. Но вообще, в отладчике можно получить всю информацию.


Для полноты картины могу выложить проект. Про то, что индексация начинается с нуля я в курсе, но проблема точно не в этом. Таки я не умею работать с отладчиком, времени очень мало, так что не научусь, но обещаю в дальнейшем.

Это сообщение отредактировал(а) ServanteS21 - 2.5.2014, 20:15
PM MAIL   Вверх
diadiavova
Дата 3.5.2014, 07:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Цитата(ServanteS21 @  2.5.2014,  21:14 Найти цитируемый пост)
Для полноты картины могу выложить проект.

Эмммм... ну если там не очень много разбираться, то могу посмотреть.
Цитата(ServanteS21 @  2.5.2014,  21:14 Найти цитируемый пост)
Про то, что индексация начинается с нуля я в курсе, но проблема точно не в этом. 

Ну тебе виднее. Возможно проблема есть с глобальной переменной ибо они - зло. Но опять-таки, все это определяется во время отладки, поскольку вариантов тут море.
Цитата(ServanteS21 @  2.5.2014,  21:14 Найти цитируемый пост)
Таки я не умею работать с отладчиком, времени очень мало, так что не научусь, но обещаю в дальнейшем.
Ну это едва ли не самое важное. Функций у него очень много, так что освоить будет нелегко, однако базовые операции, такие как: использование точек останова, проверка контрольных значений, пошаговое выполнение и т. п., - освоить несложно и это очень много даст.



--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0659 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.