Осмелюсь сказать, что ваша жизнь была бы намного проще, если бы вы использовали DataSet и кучу таблиц данных и привязали к ним все эти комбинации:
Я бы сделал следующее. Шаги, которые я описываю здесь, должны занять около 5 минут, с дополнительной минутой для репликации различных фрагментов кода:
Sub Form_Closing(...)
_myDataSet.WriteXml(Path.ChangeExtension(Application.ExecutablePath, "xml"))
End Sub
Эта одна строка кода сохранит весь набор данных и содержимое каждой таблицы по пути, который совпадает с именем exe, но с расширением xml. При желании вы можете указать другой номер c. Это не обязательно для работы коммуникации с другой формой, просто я думаю, вы не хотите, чтобы ваш пользователь вводил все эти данные каждый раз, когда они открывают приложение ...
Следующее, что нам нужно сделать, это сделать так, чтобы эта форма могла принимать набор данных в качестве параметра при его создании. Это сделано для того, чтобы основная форма могла быть ответственной за создание набора данных, но она будет передавать свой набор данных в эту форму для редактирования. Таким образом, две формы будут использовать одни и те же данные, и изменения, внесенные в эту форму, будут отражены в основной форме.
Поместите конструктор:
Public Sub New(ds as ThermoLamDataSet) 'whatever you called your dataset,
_thermoLamDataSet = ds 'remember I said to change the name of the dataset in the tray at the bottom of the form - here _thermoLamDataSet is whateve the dataset in the tray is called
End Sub
В основной форме, когда пользователь нажимает кнопку (Изменить базу данных?), мы передадим экземпляр набора данных основной формы в эту форму при редактировании:
Public Sub EditDatabaseButton_Click(...) Handles EditDbButton.Click
Call New EditorForm(Me._tlDS).Show() 'I'm going to rename the dataset on this form to _tlDS below
End Sub
Я решил вызвать набор данных в основной форме _tlDS
чтобы подчеркнуть, что он отличается от формы в редакторе. Это тот же тип набора данных, так что набор из основной формы может быть передан в форму редактора, использован, и, таким образом, происходит обмен данными; обе формы используют один и тот же объект в памяти, просто у них разные имена для него. У них могут быть одинаковые имена, я просто не хотел, чтобы вы предполагали, что у них были с одинаковыми именами
Давайте настроим основную форму:
- Откройте конструктор основной формы
- Откройте окно источников данных
- Разверните имя узла набора данных и узел Fiber. Используйте раскрывающийся список рядом со столбцом FiberThickness, чтобы перейти из текстового поля в поле со списком.
- Перетащите комбо FiberThickness на форму, снова в лотке появится куча всякой всячины. Если появится навигатор, удалите его - он нам не нужен. Измените стиль раскрывающегося списка комбо на DropDownList
- Переименуйте набор данных на панели в нижней части конструктора форм, измените его имя на
_tlDS
или подобное (я выбрал это, потому что предполагал, что имя ThermoLamDataSet было выбирается при добавлении файла набора данных в проект). Я обычно также переименовываю с помощью bindingsources et c, поэтому все они имеют начальный символ подчеркивания. Я делаю это своими кнопками и т.д. Повторите эти действия для других таблиц в окне источников данных (вуаль ...)
Теперь у вас есть основная форма с набором данных, набором источников привязки и некоторыми комбинированными списками, которые привязаны к таблицам набора данных. через эти источники привязки.
Вы можете запустить проект на этом этапе. Нажмите кнопку «Изменить базу данных».
Если вы сохранили текстовые поля, нажмите «+» в навигаторе привязок и запишите некоторые данные в текстовые поля, нажмите + еще раз, добавьте еще et c. Вы можете прокручивать добавленные записи.
Если вы выбрали использование сетки, это будет немного более интуитивно; напишите новые записи в нижнюю строку, отредактируйте записи редактирования, как если бы вы делали лист Excel
Закройте форму и посмотрите в основной форме комбинации; данные, которые вы отредактировали / добавили, есть, потому что обе формы работают с одним и тем же набором данных (созданным основной формой).
Остальные биты, которые нам нужно сделать:
- Добавьте процедуру для загрузки набора данных при запуске приложения
- Добавьте некоторые удобные свойства, чтобы получить текущую строку каждой таблицы данных. Я предполагаю, что вам это понадобится, потому что после того, как пользователь выберет толщину, вы захотите узнать связанный вес, чтобы вы могли что-то вычислить
Добавление процедуры для загрузки набора данных:
Public Sub MainFormLoad(...) Handles MainForm.Load
Dim path = Path.ChangeExtension(Application.ExecutablePath, "xml")
If File.Exists(path) Then _myDataSet.ReadXml()
End Sub
Да, только одна строка будет считывать набор данных из того же места, где его сохранила другая форма (если вы настроили этот logi c, сделайте то же самое здесь)
И удобное свойство, которое получает всю строку волокна, относящуюся к тому, что пользователь выбрал в комбинации волокон:
ReadOnly Property CurrentFiberRow() As ThermoLamDataSet.FiberRow
Get
'do'nt forget, I rename my BindingSources from the default fiberBindingSource to _fiberBindingSource
If _fiberBindingSource.Current Is Nothing Then Return Nothing
Return DirectCast(DirectCast(_fiberBindingSource.Current, DataRowView).Row, ThermoLamDataSet.FiberRow)
End Get
Возможно, мы бы использовали это так (я не знаю, какой у вас cal c):
If CurrentFiberRow Is Nothing Then
MessageBox.Show("Choose a fiber thickness first!")
Return
End If
Dim result = CurrentFiberRow.Thickness * CurrentFiberRow.Weight * Convert.ToDouble(fiberAreaTextBox.Text)
...