Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > DataGridView теряет связь с таблицей


Автор: ViterAlex 6.11.2009, 17:05
В свойствах DGV в DataSource записан DataView. Программно к DataView я прикрепляю таблицу данных при загрузке формы с DGV. При первом открытии формы все нормально, но стоит форму закрыть и открыть вновь, как вылетает ошибка, там где столбцы делаются невидимыми. Говорит, что не задана ссылка на объект. Хотя таблица существует, DataView существует, DataSource для DGV задан, а столбцов у DGV почему-то уже нет. В чем может быть проблема? может как-то обновлять их нужно? Таблица данных точно заполнена и привязана к DataView
Код

Imports System.Data 
Imports MouseMileage.frmMain 'Основная форма программы
Public Class frmStatistic 
   Public Shared dtStatistic As DataTable 
  Private Sub frmStatistic_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    If dtStatistic IsNot Nothing Then dtvwStat.Table = dtStatistic 
    With dgrvStat 
      .Columns("MileageStart").Visible = False 
      .Columns("MileageEnd").Visible = False 
    End With 
    cmbStatDispFixedRange.SelectedIndex = 6 
  End Sub 

  Private Sub dgrvStat_CellFormatting(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles dgrvStat.CellFormatting 
    If e.ColumnIndex = dgrvStat.Columns("Mileage").Index Then e.Value = CreateString(e.Value) 
  End Sub 
  
End Class

Автор: KuMa1104 6.11.2009, 23:35
Ух неселён я в VB но судя по твоим словам 
 наверно дело в том что ты место того чтобы опять обращаться к существуюшему классу, создаеш новый.

Добавлено через 1 минуту и 17 секунд
Что пишет та???
что то вроде 
Obgect reference not set of  .....

Автор: ViterAlex 7.11.2009, 01:03
Цитата(KuMa1104 @  6.11.2009,  23:35 Найти цитируемый пост)
Что пишет та???

Object reference not set to an instance of an object.

Похоже, что ты прав, но почему так происходит? Если форму не закрывать, а просто прятать, то всё работает, а если закрыть, то следующий вызов дает такое исключение.
Я же проверял, DataSource на месте, таблица в DataView тоже на месте, только в DataGridView нет столбцов.

Поясню еще принцип работы, может это поможет. Итак, есть основная форма, которая добавляет записи в таблицу по нажатию кнопки. Поля в таблице задаются сразу при загрузке основной формы. DataGridView используется только для отображения. Никакого редактирования я не планирую. 
Эта строчка
Код

If dtStatistic IsNot Nothing Then dtvwStat.Table = dtStatistic 

появилась уже после того, как вылезла ошибка. До этого я присоединял таблицу к DataView при создании таблицы.
Сначала я вообще сделал без DataView и прикручивал таблицу к DataGridView напрямую. Но, поскольку нужно будет фильтровать выводимые строки, то решил остановится на DataView, как наиболее простом компоненте для этой цели. 

Автор: KuMa1104 8.11.2009, 14:06
Ой ты так много понаписал а у меня бадун, вникать очень трудно, а воможно что и не нужно.

Цитата(ViterAlex @  7.11.2009,  01:03 Найти цитируемый пост)
Object reference not set to an instance of an object.


Компилятор ругаеться что  у тебя нет обекта.

Код

class a
{
public int d = 0;
}
main()
{
 a A;
A.d = 6;  //Object reference not set to an instance of an object  Надо не забывать A = new a();

}

Поматри внемательно, может ты когда ее повторно вызываеш, ты забыл её инициализировать

Автор: ViterAlex 8.11.2009, 15:23
Перед открытием окна переменная dtStatistic уже инициализирована, в ней содержатся данные и она привязана к DataView, а DataView, в свою очередь, привязан к DataGridView еще на этапе проектирования.

Автор: KuMa1104 9.11.2009, 00:01
Ой, разум мой несколько прояснился и я начал замечать детали)

Цитата(ViterAlex @  8.11.2009,  15:23 Найти цитируемый пост)
Перед открытием окна переменная dtStatistic уже инициализирована, в ней содержатся данные и она привязана к DataView, а DataView, в свою очередь, привязан к DataGridView еще на этапе проектирования.


Но Компилятор ругаеться что  у тебя нет обекта!!!!!!!!!!!!!!!!!!!!!!!!!!!

Цитата(ViterAlex @  7.11.2009,  01:03 Найти цитируемый пост)
только в DataGridView нет столбцов.


Значит ты либо указываеш не правильное имя для столбца и он его не находит, либо у тебя его тупа нет, наверное всётаки там ничего нет!!!

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

Одно дело это то что ты там считаеш, а совсем другое то что там может оказаться)))))))


Автор: ViterAlex 9.11.2009, 00:55
Цитата(KuMa1104 @  9.11.2009,  00:01 Найти цитируемый пост)
Одно дело это то что ты там считаеш, а совсем другое то что там может оказаться)))))))

Уважаемый KuMa1104, я совершенно с тобой согласен. Первое, что я сделал, это поставил брейкпоинт и посмотрел. Всё проверил: таблица есть, столбцы в ней есть, DataView тоже есть и таблица к нему привязана, сам DataView привязан к DataGridView, но столбцов у DataGridView нет. Columns = 0 и хоть кол на голове теши!
Опять же эта штука проявляется только если форму с DataGridView открыть, закрыть и опять открыть. Форма не главная, вызывается из меню. Так вот, запустил я свою программу. Вызываю это окно со статистикой. Показывает, всё на месте: и таблица, и столбцы указанные спрятаны. Хорошо, закрыл форму, вызываю её опять. И тут я получаю мессэдж, что нет у меня таких столбцов


Автор: KuMa1104 9.11.2009, 11:20
Цитата(ViterAlex @  9.11.2009,  00:55 Найти цитируемый пост)
Всё проверил: таблица есть, столбцы в ней есть, DataView тоже есть и таблица к нему привязана, сам DataView привязан к DataGridView, но столбцов у DataGridView нет. Columns = 0 и хоть кол на голове теши!


Вот плохо что ты на VB пишеш, я ж провыерить нормально не могу. Но проект выложи  дэбагом проидусть всётаки.

Код

MyWiew = new DataView(thisDataSet.Tables["Customers"]);
    
dataGridView1.DataSource = MyWiew;

Собственно интересуют 2 строчки.

Если таблица есть, столбцы в ней есть, DataView тоже есть и таблица к нему привязана.

То проверь ещё раз, сначала у DataView по твоему утверждению там не НОЛЬ только проверь во второй раз когда форму открываеш.
Код

MyWiew.Table.Columns.Count


Если там не ноль, то тогда когда привязываеш её к dataGridView1 то после у него тоже свойство
Код

((DataView)dataGridView1.DataSource).Table.Columns.Count


они должны совпадать, если нет то проверь свойства на совпадения

Код

((DataView)dataGridView1.DataSource).Table.TableName
MyWiew.Table.TableName


Автор: ViterAlex 9.11.2009, 11:54
Вот что показывает на брэйкпоинт. Всё есть.
user posted image
Всё проверил, всё на месте, кроме Columns у DataGridView при повторном вызове формы.
Проект выслал.

Автор: KuMa1104 9.11.2009, 13:16
Цитата(ViterAlex @  9.11.2009,  11:54 Найти цитируемый пост)
Проект выслал.

И где он???
Куда ты его выслал??

Вот так нужно

Афоризм:

Добавлено через 11 минут и 51 секунду
И не забудь Базу данных))

Автор: ViterAlex 9.11.2009, 13:54
Выслал на мыло тебе, ящик, что на рамблере
База данных не нужна. Просто запусти, выбери меню «Статистика», нажми «Начать слежку», «Остановить слежку». Данные в таблицу добавятся.

Автор: KuMa1104 9.11.2009, 18:52
Я посмотрел, VB я наблюдал впервые. 
Подчёркиваю я понятия о нём не имею!!!!!!!!!!!!!!

Я несовсем понемаю, механизмы создания в нём обектов и удаления их.

Честно говоря многое меня повергло в шок.
Я так понял что там переменные не инициализируються вообще.

Взгленул на твою проблему. Исправил))))

вставь в код для обработчика клика
Код

Private Sub mnuStatistic_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuStatistic.Click
        With My.Settings
            frmStatistic.dgrvStat.AutoGenerateColumns = True
            nMileage = .Mileage
            frmConfig.cmbUnits.SelectedIndex = .cmbConfigUnits
            mnuStatistic.Enabled = .chbConfigKeepStatistics
            nCalibrateCoeff = .CalibrCoeff
            If Not .Calibrated Then mnuCalibrate_Click(mnuCalibrate, e)
            If .dbFile <> "" And My.Settings.chbConfigKeepStatistics Then
                dtStatistic = New DataTable
                ReadDB(dtStatistic, .dbFile, "xml")
            Else
                CreateNewDataTable(dtStatistic)
                'frmStatistic.dgrvStat.DataSource = dtStatistic
            End If
            If .chbConfigAutoStart Then ShadowingOn(btnStartStop, e)
            If .chbConfigShowFlying Then frmFlying.Show()
            lblCurrPosValue.Text = "—"
            Me.Location = .frmMainLocation
            DisplayDistance()
        End With
        frmStatistic.Show()
    End Sub


вместо своего
Код

 Private Sub mnuStatistic_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuStatistic.Click
        
        frmStatistic.Show()
    End Sub


Я взял твой метод инициализации и заставил инициализировать каждый раз при вызове.

Я не знаю где и что там не работало, и знать не хочу, дальше сам методом тыка убери всё ненужное от туда и будет работать.

А после возьми книжку по С# и изучай)))))

Добавлено через 8 минут и 33 секунды
Блин слушай я себя реально после этого чуть больше уважать стал.

Вот сижу дальше текст твоей программы читаю, в именно VB вообще понять ничего не могу smile 
Но всё работает))) 

Автор: ViterAlex 9.11.2009, 20:26
KuMa1104, ты гений, хотя я сам не понимаю почему.

Перенес объявление переменной dtStatistic внутрь главной формы и всё заработало. Но я не пойму почему так происходит. Ведь я её изначально объявил как Shared, и инициализировал при загрузке главной формы. Если я закрываю окно, то класс уничтожается? Что, если переменная объявлена внутри класса, то её обязательно внутри класса и инициализировать нужно? Как-то я не совсем понимаю.

Про си-шарп я задумываюсь давно, но толчка нет, наверное придется «плюсы» все-таки учить, нужно будет скоро по работе

Автор: KuMa1104 9.11.2009, 20:49
Цитата(ViterAlex @  9.11.2009,  20:26 Найти цитируемый пост)
Ведь я её изначально объявил как Shared, и инициализировал при загрузке главной формы. Если я закрываю окно, то класс уничтожается? Что, если переменная объявлена внутри класса, то её обязательно внутри класса и инициализировать нужно? Как-то я не совсем понимаю.


Не чего страшного это же VB думаю его никто до конца не понимает)))))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)