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


Автор: mrSomeoneelse 9.8.2009, 23:09
Есть база ms sql, dataadapter, dataset, datagridview. И куча пользователей, которые постоянно дополняют и меняют базу данных.  Есть у адаптера свойство fill которое обновляет содержимое dataset и соответственно dataGridView. при этом курсор есть был на какой-то n-ой строку перескакивает на первую, а хотелось бы чтобы он остался на выбранной строке. 
Как это сделать?

Автор: Gluttton 10.8.2009, 16:01
Метод грубой силы smile ...

Поскользу порядок записей в БД не детерминирован, то можно перед каждым вызовом fill'а запоминать первичный ключ (ПК) записи на которой стоит курсор, а после выполнения fill'а устанавливать его (курсор) обратно по ключу...

Просто проблема, наверное в том, что ПК не отображается?.. Тогда можно попробовать воспользоваться потенциальным ключом (если такие есть)...

Автор: mrSomeoneelse 11.8.2009, 11:19
Методом грубой силы не получается, ибо ни dataGridView ни DataSet не имеют прямого метода типа "поставь курсор(номер строки)" есть способ поставить на первую строку и перебирать методом NextRow пока не дойдем до нужной... но представте что это обновление происходит раз в 2 секунды, и при таком обновлении кто-то нажимает кнопку "редактировать запись" и выбирается одна из записей до которой успел дойти nextRow при очередном заполнении....

Очень это не хорошо. Есть ли другой, более разумный метод?

Автор: branday 11.8.2009, 18:00
У меня реализовано вот так:
//получаем номер строки
            int i = dGVSpecifikaciya.SelectedCells[0].RowIndex;
//получаем индекс первой видимой строки
            int firstDisplayCellIndex = dGVSpecifikaciya.FirstDisplayedScrollingRowIndex;
//тут я получаю ID моей записи
            int fidspec = Convert.ToInt32(dGVSpecifikaciya.Rows[i].Cells["ID"].Value.ToString());
//Вызов диалога для поиска товара
            F_FindeTovarNew dlg = new F_FindeTovarNew(this, fidspec, currentSpecID);
            dlg.ShowDialog();
//Далее обновляю данные
            #region обновление в форме
            using (SoodaTransaction trans = new SoodaTransaction())
            {
                Spec sp = Spec.Load(currentSpecID);
                bSSpecifikaciya.DataSource = sp.CollectionOfSpecifikaciya2;
                bSSpecifikaciya.Position = bSSpecifikaciya.Find("ID", fidspec);
                bgWorker.RunWorkerAsync();
            }
            #endregion
            dGVSpecifikaciya.FirstDisplayedScrollingRowIndex = firstDisplayCellIndex;
        }

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