Здравствуйте! Сегодня: Чт, 22 Окт 2020, Ваш IP: 3.210.201.170 Войти через loginza
 
Вход | Регистрация | Забыли пароль?
Мой Kbyte.Ru
> Список форумов Kbyte.Ru - - Базы данных
+ Создать новую тему Страница: 1
Тема: DataGridView, Найдите решение, ПОЖАЛУЙСТА. · +  +  дата добавления: 11.03.2013 / 15:35
Автор темы:
capetownn
capetownn
тем: 47 / ответов: 40 / благодарностей: 8 / репутация: 0
ответов: 40
создал(а) тем: 47


Среда Visual Basic NET STUDIO’2010 Professional
На "Form1" имеется "DataGridView 1", который заполнен из ACCESS
Внёс изменения в столбец номер 1 строки номер 4.
Изменения ввожу в TextBox, находящемся на другой форме "SubFormForEnter2".
После закрытия второй формы указатель в "DataGridView 1" становится на
Нолевую строку, а надо поставить на 4-ую строку, т.е. ту, которую отредактировал.

Public LastPos As Integer ' храню номер редактируемой строки. Объявлена в "Module1"
На "Form1" имеется кнопка Button9, к которой прикреплён код:
LastPos = Me.DataGridView1.CurrentCellAddress.Y ' запоминаю номер РЕДАКТИРУЕМОЙ строки – это 4-ая строка
With SubFormForEnter2 
     .txtLastName.Text = DataGridView1.CurrentRow.Cells(1).Value
    .Show() ' показываю форму "SubFormForEnter2"
End With

Для возврата на 4-ую строку после закрытия SubFormForEnter2
Использую нижеприведенную строку
Me.DataGridView1.CurrentCell = Me.DataGridView1.Item(0, LastPos) 
в событии щелчка на кнопке Button9 после "End With"
1. В коде, прикреплённом к кнопке " Button1", находящейся на "SubFormForEnter2"
Form1.DataGridView1.CurrentCell = Form1.DataGridView1.Item(0, LastPos) 
Эта кнопка закрывает форму "SubFormForEnter2" и сохраняет внесенніе изменения в таблицу
2. В коде события формы SubFormForEnter2:
Private Sub SubFormForEnter2_FormClosing
События Validating< Validated НЕ ПОДХОДЯТ.
Проверка значения в переменной LastPos показывает, что оно = 0,
А должно быть 4. Проверял по всему решению не изменется ли значение
Переменной LastPos? – не меняю нигде. Только один раз вверху:
СПАСИБО!
Технологии: .NET Framework
 
Ответ # 1 # · +  +  дата добавления: 11.03.2013 / 17:11
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


Значение LastPos можно передавать в свойство Tag создаваемого экземпляра формы:
With SubFormForEnter2 
   .Tag = Me.DataGridView1.CurrentCellAddress.Y 'или Me.DataGridView1.CurrentCell.RowNumber
   .txtLastName.Text = DataGridView1.CurrentRow.Cells(1).Value
   .Show() ' показываю форму "SubFormForEnter2"
End With
Form1.DataGridView1.CurrentCell = Form1.DataGridView1.Item(0, Me.Tag)

Это самый простой, но не идеальный, вариант.
Правильней передавать подобные значения через конструктор. В форме SubFormForEnter2 объявить метод New:
Private _LastPos As Integer
Public Sub New(lastPos As Integer) 'можно указать любое количество переменных, любого типа
  'код, который должна сгенерировать Visual Studio нужно оставить без изменений
   _LastPos = lastPost ' передаем полученное значение в локальную переменную на уровне формы
End Sub
Form1.DataGridView1.CurrentCell = Form1.DataGridView1.Item(0, _LastPos)
при создании экземпляра формы передать номер строки:
Dim SubFormForEnter2 As New SubFormForEnter2(Me.DataGridView1.CurrentCell.RowNumber)
With SubFormForEnter2 
   .txtLastName.Text = DataGridView1.CurrentRow.Cells(1).Value
   .Show() ' показываю форму "SubFormForEnter2"
End With

Или можно сделать свойство в форме SubFormForEnter2, и использовать по аналогии с Tag.

В коде формы SubFormForEnter2:
Public Property LastPos As Integer
With SubFormForEnter2 
   .LastPos = Me.DataGridView1.CurrentCellAddress.Y 'или Me.DataGridView1.CurrentCell.RowNumber
   .txtLastName.Text = DataGridView1.CurrentRow.Cells(1).Value
   .Show() ' показываю форму "SubFormForEnter2"
End With
 
Ответ # 2 # · +  +  дата добавления: 12.03.2013 / 18:07
Автор ответа:
capetownn
capetownn
тем: 47 / ответов: 40 / благодарностей: 8 / репутация: 0
ответов: 40
создал(а) тем: 47


Большое спасибо за столь много приложенных Вами усилий
помочь решить проблему.
К сожалению она к успеху не привела.
Вот что имеем после ИЗМЕНЕНИЙ В ТЕКСТЕ процедур:
Конструктор с параметром, который Вы предложили создать, приводит
к error если конструктор без параметров временно закомментировать, на Form1 оператор
With SubFormForEnter2 
   .MaskTxtBoxtxtNumPensCertificate.Text = DataGridView1.CurrentRow.Cells(0).Value
  .Tag = Me.DataGridView1.CurrentCellAddress.Y 'или Me.DataGridView1.CurrentCell.RowNumber  
   '- .Tag = Me.DataGridView1.CurrentCell. ' RowNumber - отсутствует после точки
End With
Ошибка 11 "SubFormForEnter2" является типом и не может использоваться как выражение.
Public Sub New(ByVal lastPos As Integer) 'можно указать любое количество переменных, любого типа  
        InitializeComponent()
        _LastPos = lastPos ' передаем полученное значение в локальную переменную на уровне формы  
End Sub
Public Sub New() 
        InitializeComponent()
        _LastPos = LastPos ' передаем полученное значение в локальную переменную на уровне формы  
End Sub
Транслятор выбирает ТОЛЬКО конструктор без параметров, несмотря на присутствие их обоих в классе формы "SubFormForEnter2"

Ниже строка, используемая Me.Tag корректна, НО НЕ ВЫБИРАЕТ 4-УЮ строку в DataGridView1
Form1.DataGridView1.CurrentCell = Form1.DataGridView1.Item(0, Me.Tag)
Строку
Dim SubFormForEnter2 As New SubFormForEnter2(Me.DataGridView1.CurrentCell.RowNumber)

Перед With SubFormForEnter2 транслятор НЕ ПРОПУСКАЕТ из-за "RowNumber"
Ошибка 15 Ссылка на член, не являющийся общим, должна быть ссылкой на объект.
Это сообщение выводится если закомментировать конструктор без парметров в Form1. Предполагаю, что Ваше намерение
Dim SubFormForEnter2 As New SubFormForEnter2(Me.DataGridView1.CurrentCell.RowNumber)
Правильное, ЕСЛИ бы не RowNumber.
Я, к сожалению, НЕ МОГУ ЭТОГО РЕШИТЬ.
PS: Форма "SubFormForEnter2" "знает" номер редактируемой строки, например, 4.

СПАСИБО!
 
Ответ # 3 # · +  +  дата добавления: 12.03.2013 / 19:15
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


'- .Tag = Me.DataGridView1.CurrentCell. ' RowNumber - отсутствует после точки
Значит RowIndex. Всех названий не запомнить, нужно логику использовать :)
Public Sub New()
InitializeComponent()
_LastPos = LastPos ' передаем полученное значение в локальную переменную на уровне формы
End Sub
В безпараметизированном конструкторе невозможно принять LastPos, т.к. его просто там нет.


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

+ WindowsApplication5.zip (57,8 Кб)  
Ответ # 4 # · +  +  дата добавления: 15.03.2013 / 17:50
Автор ответа:
capetownn
capetownn
тем: 47 / ответов: 40 / благодарностей: 8 / репутация: 0
ответов: 40
создал(а) тем: 47


Алексей Немиро
ИСКРЕННЕ БЛАГОДАРЮ
всё работает благодаря Вам.
Ещё раз БОЛЬШОЕ СПАСИБО!
 
Страница: 1 + Создать новую тему