MS Visual Studio 2010

OlgaI
Сообщений: 145
Зарегистрирован: 19 сен 2011, 21:00

MS Visual Studio 2010

Сообщение OlgaI » 06 окт 2011, 12:15

NT, такие хорошие примеры, спасибо.
Обязательно будут полезны. Конвертировались в VS2010.
Только библиотека для преобразования в pdf потребовала регистрации, напрягаться не стала.
Последний раз редактировалось OlgaI 28 ноя 2019, 18:09, всего редактировалось 1 раз.
Причина: test

OlgaI
Сообщений: 145
Зарегистрирован: 19 сен 2011, 21:00

MS Visual Studio 2010

Сообщение OlgaI » 06 окт 2011, 12:27

Создается публикация для приложения, сборка выкладывается в локальной сети в общедоступное место на сервере. Приложение у пользователя работает в режиме автоматического обновления. Обновление запускается само при старте приложения, после обнаружения новой версии на сервере. Это выглядит как картинка поиска, потом вопрос, обновление доступно, обновить? Потом в окошке показан Bar, видно как происходит копирование, окошко исчезает и совершенно пустая пауза на несколько десятков секунд, затем неожиданно для пользователя запускается приложение. Можно ли установить свою заставку на место пустой паузы и как?

Заставка при обычном запуске приложения делается очень просто, а как сделать заставку для обновления?
Последний раз редактировалось OlgaI 28 ноя 2019, 18:09, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
NT
Сообщений: 3384
Зарегистрирован: 25 янв 2010, 21:00

MS Visual Studio 2010

Сообщение NT » 06 окт 2011, 15:52

OlgaI писал(а):Source of the post

Тогда вместо одного структурного массива M, делаю 3 простых M1, M2, M3.
Пишу аналогичную процедуру выбора, которая ищет соответствующие элементы в массивах M1, M2, M3. И начальное присваивание:
Combobox1.DataSource = M1.clone
Combobox2.DataSource = M2.clone
Combobox3.DataSource = M3.clone

Запускаю. Список Combobox1 раскрывется, а списки Combobox2 и Combobox3 не раскрываются вообще. Решила что где-то ошибка, все возвращаю назад.
На другой день опять создаю новое окно, пишу все еще раз - опять точно так же не работает.

Немного разгрузился и посмотрел код.

Вы не правильно используете свойства DataSource для обьектов ComboBox i DataGridView.
Свойство DataSource расчитанo на загрузку обьектов типа DataTable.

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

Но на DataGridView массив загружать в качестве DataSource - уже не правильно. Будет каша.
DataGridView на Clone не обращает внимания.
На DataGridView.DataSource жуть много чего заворочено.

Код: Выбрать все

' WindowsApplication1 as WindowsApplication:
' Form1 as Form;
' ComboBox1, ComboBox2 as ComboBox;
' DataGridView1 as DataGridView

Public Class Form1

 Private Sub Form1_Load(ByVal sender As System.Object, _
 ByVal e As System.EventArgs) Handles MyBase.Load
 '
 ' Fill in the data grid, combobox on form load
 '
 Dim daysOfWeek As String() = _
 New String() {"Monday", "Tuesday", "Wednesday", _
 "Thursday", "Friday", "Saturday", _
 "Sunday"}

 'тут в примере с Clone
 ComboBox1.DataSource = daysOfWeek.Clone
 ComboBox2.DataSource = daysOfWeek.Clone

 'а потом попробуйте без Clone
 'ComboBox1.DataSource = daysOfWeek
 'ComboBox2.DataSource = daysOfWeek

 DataGridView1.DataSource = daysOfWeek

 End Sub

End Class
Последний раз редактировалось NT 28 ноя 2019, 18:09, всего редактировалось 1 раз.
Причина: test

OlgaI
Сообщений: 145
Зарегистрирован: 19 сен 2011, 21:00

MS Visual Studio 2010

Сообщение OlgaI » 06 окт 2011, 16:30

NT писал(а):Source of the post
Но на DataGridView массив загружать в качестве DataSource - уже не правильно. Будет каша.
DataGridView на Clone не обращает внимания.
На DataGridView.DataSource жуть много чего заворочено.


Спасибо.
А для одного нового столбца DataGridViewComboColumn можно загружать массив?
Может быть неприятности п.1 начались из-за этого? (он там был загружен при добавлении столбца)
Последний раз редактировалось OlgaI 28 ноя 2019, 18:09, всего редактировалось 1 раз.
Причина: test

OlgaI
Сообщений: 145
Зарегистрирован: 19 сен 2011, 21:00

MS Visual Studio 2010

Сообщение OlgaI » 07 окт 2011, 13:19

Вот такие у меня процедуры по п. 1) проблемы с ComboBox. Все работает, но понадобилась _Combo1_0_MouseUp для разрешения проблемы ухода фокуса. И я не понимаю, прочему возникает проблема форматирования, которая решилась с помощью dgData_CellFormatting.

dgData - таблица DataGridView

Код: Выбрать все


 Public NamesP(0) As String ' массив внешних имен

 Private WithEvents ctlEntry As Windows.Forms.ComboBox ' поле ввода со списком для таблицы

 ' Эта процедура чтения работает 1 раз при старте приложения,
 ' Массив NamesP используется часто в разных местах
 Public Function ReadNamesP() As Boolean
 '------------------------------------------------------------------
 ' Чтение имен из БД внешних имен в массив имен проекта.
 '------------------------------------------------------------------
 ' инициализация здесь обязательна
 ReDim NamesP(0)
 NamesP(0) = ""

 ' Загружаем данные из баз, определяем число и списки для параметров
 Dim connectionString As String = _
 "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
 NamesMdb & ";User Id=admin;Password=;"

 ' открываем базу данных действий и заполняем параметры
 Using connection As New System.Data.OleDb.OleDbConnection(connectionString)
 Dim s As String = _
 "SELECT T4_Names.Имя FROM T4_Names ORDER BY T4_Names.Имя"

 ' Создаем объект запроса из БД
 Dim query As New System.Data.OleDb.OleDbCommand(s, connection)
 Dim dataReader As System.Data.OleDb.OleDbDataReader

 ' Открываем соединение и заполняем
 Try
 connection.Open() ' открываем соединение с БД
 dataReader = query.ExecuteReader()

 If dataReader.HasRows Then
 Do While dataReader.Read()
 If Not IsDBNull(dataReader(0)) Then
 NamesP(UBound(NamesP)) = dataReader(0)
 System.Array.Resize(NamesP, NamesP.Length + 1)
 End If
 Loop
 System.Array.Resize(NamesP, NamesP.Length - 1)
 End If
 dataReader.Close()
 query.Dispose()
 connection.Close() ' закрываем соединение с БД

 Catch ex As Exception
 MsgBoxE(ex.Message) ' обработка ошибок соединения с БД
 ' закрываем соединение с БД
 If Not dataReader Is Nothing Then dataReader.Close()
 If Not query Is Nothing Then query.Dispose()
 If Not connection Is Nothing Then connection.Close()
 Return False
 End Try
 End Using

 Return True

 End Function


 ' Эта процедура вызывается из Load формы
 Private Sub Combolist()
 '------------------------------------------------------------------
 ' Формирование списка имен для поля со списком
 '------------------------------------------------------------------
 Dim i As Short = 0 ' счетчик цикла

 ' задаем список для всех полей Combo
 _Combo1_0.DataSource = NamesP.Clone


 dgData.Columns.Remove(dgData.Columns(2).Name)
 AddComboBoxColumn(dgData, 2, "Значение", True, _
 DataGridViewComboBoxDisplayStyle.Nothing)
 End Sub


 Public Sub AddComboBoxColumn(ByVal dgw As System.Windows.Forms.DataGridView, _
 ByVal Index As Integer, _
 ByVal ColName As String, _
 Optional ByVal HideCellStyle As Boolean = False, _
 Optional ByVal DropDnStyle As DataGridViewComboBoxDisplayStyle = _
 DataGridViewComboBoxDisplayStyle.DropDownButton)
 '------------------------------------------------------------------
 ' Добавление столбца типа CоmboBox со списком имен в таблицу.
 '------------------------------------------------------------------
 Dim comboboxColumn As New DataGridViewComboBoxColumn
 ' Задание объекта столбца таблицы
 With comboboxColumn
 .DataPropertyName = "Column" & Index
 .HeaderText = ColName
 .DropDownWidth = 160
 .Width = 90
 .MaxDropDownItems = 8
 .FlatStyle = FlatStyle.System
 .Resizable = DataGridViewTriState.True
 .DataSource = NamesP.Clone
 .DisplayStyle = DropDnStyle
 ' скрываем стиль для ячейки
 .DisplayStyleForCurrentCellOnly = HideCellStyle
 .AutoComplete = False
 End With

 dgw.Columns.Insert(Index, comboboxColumn)
 End Sub


 Private Sub dgData_CellFormatting(sender As Object, _
 e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) _
 Handles dgData.CellFormatting
 '------------------------------------------------------------------
 ' Обработка события форматирования ячейки
 ' Действие.
 ' Для поля со списком присвоение правильного значения ячейки,
 ' а не элемента из поля ввода.
 '------------------------------------------------------------------

 If (e.ColumnIndex <> 2) Then Exit Sub
 If IsNothing(dgData.Item(e.ColumnIndex, e.RowIndex).Value) Then Exit Sub
 e.Value = dgData.Item(e.ColumnIndex, e.RowIndex).Value

 e.FormattingApplied = True

 End Sub


 Private Sub dgData_EditingControlShowing(sender As Object, _
 e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) _
 Handles dgData.EditingControlShowing
 '------------------------------------------------------------------
 ' Обработка события показа поля для редактирования ячейки
 ' Действие.
 ' Сохранение адреса поля ввода и установка его стиля.
 ' Передача значения в поле ввода.
 '------------------------------------------------------------------
 If TypeOf dgData.EditingControl Is ComboBox Then
 ctlEntry = dgData.EditingControl
 If dgData.CurrentCell.ColumnIndex = 1 Then
 ' редактируется формат параметра
 ctlEntry.DropDownStyle = ComboBoxStyle.DropDownList
 ctlEntry.BackColor = dgData.DefaultCellStyle.BackColor
 ctlEntry.ForeColor = dgData.DefaultCellStyle.ForeColor
 ' запоминаем начальное значение формата
 SaveFormat = dgData.CurrentCell.Value

 Else
 ' редактируется значение параметра
 If dgData.Item(1, dgData.CurrentCell.RowIndex).Value = "A" Then
 ctlEntry.DropDownStyle = ComboBoxStyle.DropDown
 ctlEntry.AutoCompleteMode = AutoCompleteMode.SuggestAppend
 ctlEntry.AutoCompleteSource = AutoCompleteSource.ListItems
 Else
 ' обычное поле (поле без списка)
 ctlEntry.DropDownStyle = ComboBoxStyle.Simple
 End If
 ctlEntry.Text = dgData.CurrentCell.Value
 ctlEntry.Focus()
 End If
 End If

 End Sub

 Private Sub ctlEntry_GotFocus(sender As Object, _
 e As System.EventArgs) _
 Handles ctlEntry.GotFocus
 '------------------------------------------------------------------
 ' Обработка события получения фокуса полем ввода в таблицу
 ' Действие.
 ' Удалет область выделения.
 '------------------------------------------------------------------
 ' работает только для dropdown
 ctlEntry.BackColor = dgData.DefaultCellStyle.BackColor
 ctlEntry.ForeColor = dgData.DefaultCellStyle.ForeColor
 If ctlEntry.DropDownStyle = ComboBoxStyle.Simple Then Exit Sub

 Try
 sender.SelectionStart = Len(sender.Text)
 sender.SelectionLength = 0
 Catch ex As Exception
 End Try
 End Sub

 ' И другое разное на события ctlEnry (не существенно):

 Private Sub ctlEntry_TextChanged(sender As Object, _
 e As System.EventArgs) _
 Handles ctlEntry.TextChanged
 '------------------------------------------------------------------
 ' Обработка события изменения значения в поле ввода
 ' Назначение.
 ' Пересчет контрольной суммы.
 '------------------------------------------------------------------
 With dgData
 ' работаем только для формата
 If .CurrentCell.ColumnIndex <> 2 Then Exit Sub ' пересчет КС
 ' проверяем значение на соответствие формату
 If CheckRowValue(ctlEntry.Text, .CurrentCell.RowIndex) Then
 ' пересчитываем КС во всех строках таблицы
 For i = .CurrentCell.RowIndex To .RowCount - 1
 CalculateCRC16(i, ctlEntry.Text, .CurrentCell.RowIndex)
 Next
 End If
 End With
 End Sub


 ' А это парирование ошибок потери фокуса на _Combo1_0
 Private Sub _Combo1_0_MouseUp(sender As Object, _
 e As System.Windows.Forms.MouseEventArgs) _
 Handles _Combo1_0.MouseUp
 '------------------------------------------------------------------
 ' Обработка события отжатия кнопки мыши в поле _Combo1_0
 ' Действие.
 ' Если список не раскрыт, установка фокуса (фокус теряется по
 ' неизвестной причине).
 '------------------------------------------------------------------
 If Not _Combo1_0.Focused And Not _Combo1_0.DroppedDown Then
 _Combo1_0.Focus()
 End If
 End Sub

Последний раз редактировалось OlgaI 28 ноя 2019, 18:09, всего редактировалось 1 раз.
Причина: test

OlgaI
Сообщений: 145
Зарегистрирован: 19 сен 2011, 21:00

MS Visual Studio 2010

Сообщение OlgaI » 10 окт 2011, 13:19

Сегодня я разобралась со всеми фокусами ComboBox. А ларчик просто открывался.

ComboBox и некоторые другие поля находятся в SplitContainer, который имеет такой же цвет, что и фон формы, и практически невидим, обнаруживается только по изменению формы указателя мыши на краю поля ComboBox, которое надо раздвинуть в ширину. А когда кликается мышкой ComboBox, фокус устанавливается не на нем, а на SplitContainer, и визуально это трудно заметить. Если до того в SplitContainer было сфокусировано текстовое поле TextBox на другой панели, и текст вводится с клавиатуры, то он вводится в TextBox, а не в ComboBox. И дальше тому подобное, и куда попало.

Проблема решается просто: на событиях MouseClick для элементов управления в SplitContainer'e пишем одну строчку вида:
If Not Sender.Focused then Sender.Focus()
И все.

Вот такое оно, визуальное программирование.
Последний раз редактировалось OlgaI 28 ноя 2019, 18:09, всего редактировалось 1 раз.
Причина: test

OlgaI
Сообщений: 145
Зарегистрирован: 19 сен 2011, 21:00

MS Visual Studio 2010

Сообщение OlgaI » 20 дек 2011, 12:45

Для БД MS Access, в DAO было написано обновление ссылок для связанных таблиц из другого файла .mdb (диспетчер связанных таблиц):

Dim wrkArea As dao.Workspace ' рабочая область
Dim dbsBase As dao.Database ' база данных
Dim s As String = "" ' рабочая строка
Dim DAODBEngine_definst As dao.DBEngineClass = New dao.DBEngineClass

' создаем рабочую область
wrkArea = DAODBEngine_definst.CreateWorkspace("", "admin", "",dao.WorkspaceTypeEnum.dbUseJet)
' открываем базу данных
dbsBase = wrkArea.OpenDatabase(FileMdb)

s = ";DATABASE=" & ProdMdb

For i = 0 To dbsBase.TableDefs.Count - 1
If dbsBase.TableDefs(i).Name = "Table1" Then
dbsBase.TableDefs(i).Connect = s
dbsBase.TableDefs(i).RefreshLink()
End If
Next i

dbsBase.Close()
wrkArea.Close()

Можно ли это сделать в ADO.NET?
Последний раз редактировалось OlgaI 28 ноя 2019, 18:09, всего редактировалось 1 раз.
Причина: test

OlgaI
Сообщений: 145
Зарегистрирован: 19 сен 2011, 21:00

MS Visual Studio 2010

Сообщение OlgaI » 22 дек 2011, 12:58

Можно сделать обновления ссылок на внешние таблицы, используя COM, но не хочется из-за двух строчек включать в сборку 2 библиотеки Active-X. Неужели ничего нет в System.Data?

Ссылки на MS ActiveX Data Objects 2.8 Library Interop.ADODB.dll (msado15.dll)
MS ADO Ext. 2.8 for DDL and Secrurity Interop.ADOХ.dll (msadoх.dll)

Код: Выбрать все

 Try
 Dim cnn As New ADODB.Connection
 Dim adoxCat As ADOX.Catalog
 Dim adoxTbl As ADOX.Table

 adoxCat = New ADOX.Catalog
 cnn.Open("Provider='Microsoft.Jet.OLEDB.4.0';" & _
 "Data Source='" & FileMdb & "';")
 adoxCat.ActiveConnection = cnn
 For Each adoxTbl In adoxCat.Tables
 ' если таблица, связанная таблица JET
 If adoxTbl.Type = "LINK" Then
 adoxTbl.Properties("Jet OLEDB:Link Datasource").Value = ProdMdb
 End If
 Next
 adoxCat = Nothing
 adoxTbl = Nothing
 cnn.Close()
 Return True

 Catch ex As Exception
 MsgBoxE("RefreshConnectionDB: " & ex.Message)
 Return False
 End Try

Последний раз редактировалось OlgaI 28 ноя 2019, 18:09, всего редактировалось 1 раз.
Причина: test


Вернуться в «Computer Science»

Кто сейчас на форуме

Количество пользователей, которые сейчас просматривают этот форум: нет зарегистрированных пользователей и 1 гость