Привязка навигатора не добавляет запись при первом клике, но делает это при последующих кликах
У меня есть довольно простая маленькая форма с контейнером с вкладками для добавления некоторой информации в базу данных SQL. На одной из вкладок у меня есть несколько текстовых полей и несколько полей со списком. В верхней части этой страницы находится навигатор привязки.
Одна вещь, которая делает это немного нетипичным, заключается в том, что вместо привязки к таблице в моей базе данных она привязана (частично) к таблице данных, которую я создал в коде в форме.
Все работает в основном так, как и ожидалось, за исключением одной досадной проблемы, которую необходимо решить.
Когда я впервые нажимаю знак плюс на полосе инструментов навигатора, он не добавляет строку в мою таблицу данных. Это будет при последующих щелчках, но тогда счетчик на полосе инструментов всегда показывает еще один, что на самом деле находится в таблице данных. Я просто не вижу, как это исправить. Я искал в гугле примеры привязки навигаторов, привязанных к таблицам в коде, но безрезультатно. Все примеры привязаны к таблицам в базе данных. Я могу прикрепить свой код формы, если это поможет (как вы прикрепляете файлы здесь?)
Пожалуйста, помогите!!
Ладно, посмотрим, смогу ли я вставить сюда код формы...
Система Импорта.Окна.Формы
Система Импорта.Сведения
Система Импорта.Данных.Поставщики sqlclient
Публичный Класс CableNewForm
"определите наши объекты для временного datatable
Dim Cores_DataTable Как Новый DataTable
Dim Cores_DataRow Как DataRow
Dim Cores_Binding Как Новый BindingSource
Общественные Саб Новый()
- Этот звонок нужен проектировщику.
метод InitializeComponent()
'Добавьте любую инициализацию после вызова InitializeComponent ().
Сначала вкладки "свойства"
Попробуй
Использование соединения в качестве нового SqlClient. SqlConnection(databaseOps.connectionString)
соединение.Открыть()
Dim da As New SqlDataAdapter("select Manufacturer from Manufacturer", подключение)
- Поля со списком привязаны к соответствующим таблицам в базе данных SQL
Dim manufacturer_dt как новый DataTable
да.Заполнить(manufacturer_dt)
Если manufacturer_dt.Строк.Тогда считайте > 0
Меня.ComboBoxManufacturer.Источник данных = manufacturer_dt
Меня.ComboBoxManufacturer.DisplayMember = " Производитель"
Меня.ComboBoxManufacturer.ValueMember = " Производитель"
Меня.ComboBoxManufacturer.SelectedIndex = 0
Конец, Если
да.Команды selectcommand.CommandText = " выберите имя библиотеки из библиотеки"
Dim library_dt как новый DataTable
да.Заполнить(library_dt)
Если library_dt.Строк.Тогда считайте > 0
Меня.ComboBoxLibrary.Источник данных = library_dt
Меня.ComboBoxLibrary.DisplayMember = " libraryname"
Me.ComboBoxLibrary. ValueMember = " имя библиотеки"
Меня.ComboBoxLibrary.SelectedIndex = 0
Конец, Если
да.Команды selectcommand.CommandText = " выберите поставщика из списка поставщиков"
Dim supplier_dt как новый DataTable
да.Заполнить(supplier_dt)
Если supplier_dt.Строк.Тогда считайте > 0
Меня.ComboBoxSupplier.Источник данных = supplier_dt
Меня.ComboBoxSupplier.DisplayMember = " Поставщик"
Меня.ComboBoxSupplier.ValueMember = " Поставщик"
Меня.ComboBoxSupplier.SelectedIndex = 0
Конец, Если
да.Команды selectcommand.CommandText = " выберите cabletypeName из cabletypes"
Dim cabletype_dt как новый DataTable
да.Заполнить(cabletype_dt)
Если cabletype_dt.Строк.Тогда считайте > 0
Меня.ComboBoxCableType.Источник данных = cabletype_dt
Me.ComboBoxCableType. DisplayMember = " cabletypeName"
Me.ComboBoxCableType. ValueMember = " cabletypeName"
Меня.ComboBoxCableType.SelectedIndex = 0
Конец, Если
да.Команды selectcommand.CommandText = " выберите цветовой код из цветов"
Dim cablecolor_dt как новый DataTable
да.Заполнить(cablecolor_dt)
Если cablecolor_dt.Строк.Тогда считайте > 0
Меня.ComboBoxCableColor.Источник данных = cablecolor_dt
Меня.ComboBoxCableColor.DisplayMember = " colorcode"
Меня.ComboBoxCableColor.ValueMember = " цветовой код"
Меня.ComboBoxCableColor.SelectedIndex = 0
Конец, Если
Конец Использования
- Установите некоторые значения по умолчанию на вкладке свойства
InsertedUserTextBox.Текст = текущий пользователь
InsertedDateTimePicker.Text = DateTime. Now. ToString ("гггг/ММ/ДД")
UpdatedDateTimePicker.Text = DateTime. Now. ToString ("гггг/ММ/ДД")
NumberOfCoresTextBox.Text = " 0"
HasShieldCheckBox.Проверено = Ложь
HasGroundCheckBox.Проверено = Ложь
CableDefIdTextBox.Текст = "-1"
Поймать sqex как Sqlclient.SqlException
MsgBox ("SQL Exception:" & sqex.Message)
Catch ex As DataException
MsgBox(например, сообщение)
Конец Попытки
"Вторая страница вкладки" ядра"
Попробуй
Использование соединения в качестве нового SqlClient. SqlConnection(databaseOps.connectionString)
соединение.Открыть()
- Опять же, поля со списком привязаны к таблицам в базе данных
Использование wiretype_da в качестве нового SqlDataAdapter ("select wiretypename from wiretypes", connection)
Dim wiretype_dt как новый DataTable
wiretype_da.Заполнить(wiretype_dt)
Если wiretype_dt.Строк.Тогда считайте > 0
Меня.ComboBoxWireType.Источник данных = wiretype_dt
Me.ComboBoxWireType. DisplayMember = " имя прослушки"
Me.ComboBoxWireType. ValueMember = " имя прослушки"
Меня.ComboBoxWireType.SelectedIndex = 0
Конец, Если
Конец Использования
Использование wiregauge_da в качестве нового SqlDataAdapter ("select wiregaugecode from wiregauges", connection)
Dim wiregauge_dt как новый DataTable
wiregauge_da.Заполнить(wiregauge_dt)
Если wiregauge_dt.Строк.Тогда считайте > 0
Меня.ComboBoxWireGauge.Источник данных = wiregauge_dt
Меня.ComboBoxWireGauge.DisplayMember = " wiregaugecode"
Меня.ComboBoxWireGauge.ValueMember = " wiregaugecode"
Меня.ComboBoxWireGauge.SelectedIndex = 0
Конец, Если
Конец Использования
Использование wirecolor_da в качестве нового SqlDataAdapter ("select colorcode from colors", connection)
Dim wirecolor_dt как новый DataTable
wirecolor_da.Заполнить(wirecolor_dt)
Если wirecolor_dt.Строк.Тогда считайте > 0
Меня.ComboBoxWireColor.Источник данных = wirecolor_dt
Меня.ComboBoxWireColor.DisplayMember = " colorcode"
Меня.ComboBoxWireColor.ValueMember = " цветовой код"
Меня.ComboBoxWireColor.SelectedIndex = 0
Конец, Если
Конец Использования
Конец Использования
- Установите некоторые значения по умолчанию на вкладке ядра
CableDefIdTextBox1.Текст = "-1"
Поймать sqex как Sqlclient.SqlException
MsgBox ("SQL Exception:" & sqex.Message)
Catch ex As DataException
MsgBox(например, сообщение)
Конец Попытки
- Создайте временную таблицу данных для содержания кабельных жил.
- При нажатии кнопки "ОК" они будут записаны в базу данных
Cores_DataTable.Столбцы.Добавить ("CableWireDefId", Тип.Метод Gettype (Системы".Типа int32"))
Cores_DataTable.Столбцы.Добавить ("WireType", Type.GetType ("System.Строка"))
Cores_DataTable.Столбцы.Добавить ("CableDefId", Тип.Метод Gettype (Системы".Типа int32"))
Cores_DataTable.Столбцы.Добавить ("WireGauge", Тип.GetType ("System.Строка"))
Cores_DataTable.Столбцы.Добавить ("WireGroup", Тип.GetType ("System.Строка"))
Cores_DataTable.Столбцы.Добавить ("WireColor", Тип.GetType ("System.Строка"))
Cores_DataTable.Столбцы.Добавить ("Напряжение", Тип.GetType ("System.Двойной"))
Cores_DataTable.Столбцы.Добавить ("Затухание", Тип.GetType ("System.Двойной"))
Cores_DataTable.Столбцы.Добавить ("Сопротивление", Тип.GetType ("System.Двойной"))
- Cores_DataTable.Ограничения. Add ("me", Cores_DataTable.Столбцы.Item ("Cablewiredefid"), primaryKey:=True)
- Свяжите datatable с объектом navigator
Cores_Binding.Источник Данных = Cores_DataTable
Me.BindingNavigator1. BindingSource = Cores_Binding
- Свяжите текстовые поля
CableWireDefIdTextBox.Привязка данных.Добавить("Текст", Cores_Binding, "CableWireDefId")
WireGroupTextBox.DataBindings. Add("Text", Cores_Binding, " WireGroup")
VoltageTextBox.Привязка данных.Добавить("Текст", Cores_Binding, "Напряжение")
AttenuationTextBox.Привязка данных.Добавить("Текст", Cores_Binding, "Затухание")
ResistanceTextBox.Привязка данных.Добавить("Текст", Cores_Binding, "Сопротивление")
Конец Подводной Лодки
Private Sub KillButton_Click (sender As Object, e As EventArgs) обрабатывает KillButton.Щелчок
Меня.Рядом()
Конец Подводной Лодки
Private Sub OkButton_Click (sender As Object, e As EventArgs) обрабатывает OkButton.Щелчок
"Здесь новый кабель будет добавлен в базу данных, его жилы будут поступать от наших
"временная таблица данных, определенная в этой форме.
Меня.Рядом()
Конец Подводной Лодки
Private Sub TabControl1_SelectedIndexChanged (sender As Object, e As EventArgs) обрабатывает TabControl1.Разделе мы рассмотрим
Dim cabletype_index как целое число = 0
- Обновите количество ядер на листе свойств
NumberOfCoresTextBox.Текст = Cores_DataTable.Строк.Рассчитывать
Если Cores_DataTable.Строк.Тогда посчитайте > 1
cabletype_index = меня.ComboBoxCableType.FindString("Кабель")
Меня.ComboBoxCableType.Свойства selectedIndex = cabletype_index
Конец, Если
-если одно из ядер является щитом или землей, установите флажки на вкладке свойства
Для каждой строки как DataRow в Cores_DataTable. Rows
Если грести.Item ("WireType") = "Shield", То
HasShieldCheckBox.Проверено = Истина
cabletype_index = меня.ComboBoxCableType.FindString("кабель, экранированный")
Меня.ComboBoxCableType.Свойства selectedIndex = cabletype_index
Конец, Если
Если грести.Item ("WireType") = "Ground", То
HasGroundCheckBox.Проверено = Истина
Конец, Если
Следующий
Конец Подводной Лодки
- Привязка навигатора отменяется---------------------------------------------------------------------------------------------------
Private Sub fixComboBoxes()
- получить спецификации проводов по идентификатору
Dim type_index как целое число = 0
- временные Вары, которые я могу посмотреть во время отладки, чтобы удалить их позже.
Dim temp As String = строка.Пустой
Dim temp2 как объект
Для каждой строки как DataRow в Cores_DataTable. Rows
temp = строка.Пункт ("CableWireDefId").Метод toString()
Если CableWireDefIdTextBox.Text = temp тогда
temp2 = строка.Пункт ("Прослушка")
type_index = ComboBoxWireType.FindString(row. Item("WireType")) 'это может быть null! исправь это!
ComboBoxWireType.Свойства selectedIndex = type_index
temp2 = строка.Пункт ("WireGauge")
type_index = ComboBoxWireGauge.FindString(row. Item("WireGauge"))
ComboBoxWireGauge.Свойства selectedIndex = type_index
temp2 = строка.Пункт ("WireColor")
type_index = ComboBoxWireColor.FindString(row. Item ("WireColor"))
ComboBoxWireColor.Свойства selectedIndex = type_index
Конец, Если
Следующий
Конец Подводной Лодки
Private Sub BindingNavigatorAddNewItem_Click (sender As Object, e As EventArgs) обрабатывает BindingNavigatorAddNewItem.Щелчок
Dim rownum As Int16 = (преобразовать.ToInt16(BindingNavigator1.PositionItem.Текста) - 1)
"по какой-то причине это не добавление в cores_dt при первом щелчке,
- но он увеличивает счетчик на навигационной полосе до 1
Cores_Binding.метод AddNew()
'это добавит добавить строку в cores_dt, если первый щелчок не сделал этого, но затем он увеличивает
'снова счетчик, который будет говорить 2, даже если в datatable есть только 1 строка
Если Cores_DataTable.Строк.Количество = 0 Тогда
- Cores_Binding.метод AddNew()
Конец, Если
'нужно вручную добавить выбранный индекс comboboxes, так как они не связаны.
Если Cores_DataTable.Строк.Тогда считайте > 0
Cores_DataTable.Строки (rownum).Item ("CableWireDefId") = Преобразовать.ToInt32(BindingNavigator1.PositionItem.Текст)
Cores_DataTable.Строки (rownum).Item ("WireType") = ComboBoxWireType. Text
Cores_DataTable.Строки (rownum).Item ("WireGauge") = ComboBoxWireGauge.Текст
Cores_DataTable.Строки (rownum).Item ("WireColor") = ComboBoxWireColor. Text
Конец, Если
CableWireDefIdTextBox.Текст = BindingNavigator1.PositionItem.Текст
- Я.Cores_DataTable.AcceptChanges() 'это все полностью
'AddRowToDataTable()
'fixComboBoxes()
MsgBox ("core count is" & Cores_DataTable.Rows.Рассчитывать.Метод toString)
Конец Подводной Лодки
Private Sub BindingNavigatorMoveFirstItem_Click (sender As Object, e As EventArgs) обрабатывает BindingNavigatorMoveFirstItem.Щелчок
Cores_Binding.MoveFirst()
CableWireDefIdTextBox.Текст = BindingNavigator1.PositionItem.Текст "это будет неправильно, если строка будет удалена! получить номер из datatable
fixComboBoxes()
Конец Подводной Лодки
Private Sub BindingNavigatorMovePreviousItem_click (sender As Object, e As EventArgs) обрабатывает BindingNavigatorMovePreviousItem.Щелчок
Cores_Binding.MovePrevious()
CableWireDefIdTextBox.Текст = BindingNavigator1.PositionItem.Текст "это будет неправильно, если строка будет удалена! получить номер из datatable
fixComboBoxes()
Конец Подводной Лодки
Private Sub BindingNavigatorMoveNextItem_Click (sender As Object, e As EventArgs) обрабатывает BindingNavigatorMoveNextItem.Щелчок
Cores_Binding.метод MoveNext()
CableWireDefIdTextBox.Текст = BindingNavigator1.PositionItem.Текст "это будет неправильно, если строка будет удалена! получить номер из datatable
fixComboBoxes()
Конец Подводной Лодки
Private Sub BindingNavigatorMoveLastItem_Click (sender As Object, e As EventArgs) обрабатывает BindingNavigatorMoveLastItem.Щелчок
Cores_Binding.MoveLast()
CableWireDefIdTextBox.Текст = BindingNavigator1.PositionItem.Текст "это будет неправильно, если строка будет удалена! получить номер из datatable
fixComboBoxes()
Конец Подводной Лодки
Private Sub BindingNavigatorSaveItemButton_Click (sender As Object, e As EventArgs) обрабатывает BindingNavigatorSaveItemButton.Щелчок
"если пользователь нажимает кнопку Сохранить, но в таблице данных теперь есть строки, добавьте строку и сохраните ее вместе со значениями в диалоговом окне
Если Cores_DataTable.Строк.Количество = 0 Тогда
'AddRowToDataTable()
- Конец, Если
'fixComboBoxes()
- Я.Cores_DataTable.AcceptChanges () ' если при нажатии кнопки Сохранить есть только одна строка, она обнуляется!
Меня.Проверить()
Конец Подводной Лодки
Конец Класса
Что я уже пробовал:
Я искал в гугле примеры привязки навигаторов, привязанных к таблицам в коде, но безрезультатно. Все примеры привязаны к таблицам в базе данных. Взломанный навигатор привязки" добавить " метод сделать второе добавление, если в таблице данных есть нулевые строки, работает, но счетчик в инструментальной полосе все равно выше, чем количество строк.