это - мой код:
private void getData(string selectCommand)
{
string connectionString = @"Server=localhost;User=SYSDBA;Password=masterkey;Database=C:\data\test.fdb";
dataAdapter = new FbDataAdapter(selectCommand, connectionString);
DataTable data = new DataTable();
dataAdapter.Fill(data);
bindingSource.DataSource = data;
}
private void button1_Click(object sender, EventArgs e)
{
getData(dataAdapter.SelectCommand.CommandText);
}
private void Form1_Load(object sender, EventArgs e)
{
dataGridView1.DataSource = bindingSource;
getData("SELECT * FROM cities");
}
после данных перезагрузки по щелчку button1 выбор ячейки вскакивает на первый столбец, и полосы прокрутки сбрасывается. Как сохранить позицию DataGridView?
На другом форуме я нашел решение без каких-либо манипуляций:
private void getData(string selectCommand)
{
string connectionString = @"Server=localhost;User=SYSDBA;Password=masterkey;Database=C:\data\test.fdb";
dataAdapter = new FbDataAdapter(selectCommand, connectionString);
data = new DataTable();
dataAdapter.Fill(data);
bindingSource.DataSource = data;
}
private void button1_Click(object sender, EventArgs e)
{
dataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
dataAdapter.Fill(data);
}
private void Form1_Load(object sender, EventArgs e)
{
dataGridView1.DataSource = bindingSource;
getData("SELECT * FROM cities");
}
Это происходит потому, что вы сбрасываете или заново воздействуете на свойство DataSource вашего элемента управления DataGridView.
Чтобы выполнить желаемое, вы должны сохранить индекс CurrentItem в локальной переменной перед сбросом свойства DataSource вашего DataGridView. Однако, делая это, вы должны знать, что у вас будет такое же или большее количество данных, иначе вы получите ошибку IndexOutOfRangeException, пытаясь перейти к большему индексу, чем количество данных, фактически содержащихся в вашем DataGridView.
Таким образом, если вы хотите сохранить индекс строки или ячейки, вам придется сделать это через свойства элемента управления DataGridView, поскольку ваш BindingSource не предоставит такой возможности.
В DataGridView выбранная строка и текущий ряд (обозначенный стрелкой в заголовке строки) могут не быть одной и той же строкой. Кроме того, мы можем выбрать несколько строк в DataGridView но текущий ряд может быть только один строка. Когда свойство SelectionMode DataGridView установлено в значение FullRowSelect, текущий ряд будет всегда выбран. Если вы хотите изменить текущий ряд в DataGridView, вы можете установить свойство CurrentCell
dataGridView1.CurrentCell = dataGridView1.Rows[1].Cells[0];
Если вы хотите просто изменить выбранный ряд, вы можете установить свойство Selected нужного вам ряда в true.
dataGridView1.CurrentRow.Selected = false;
dataGridView1.Rows[1].Selected = true;
Вы можете сохранить выбранную строку перед запуском getData, используя DataGridView.CurrentRow
, и выбрать эту строку после загрузки сетки.
В на этот вопрос я ответил, как выбрать конкретную строку в DataGridView.
Edit: Я предполагал, что вы используете WinForms
Edit2: А что насчет полос прокрутки?
Вы также можете сохранить индекс первой видимой строки с помощью этого оператора
DataGridView.FirstDisplayedCell.RowIndex
В настоящее время вы загружаете данные каждый раз при загрузке страницы. Я бы предложил использовать свойство Page.IsPostback, чтобы проверить, является ли это обратной передачей или нет.
if(!Page.IsPostback)
{
dataGridView1.DataSource = bindingSource;
getData("SELECT * FROM cities");
}
Это снизит нагрузку на вашу БД и перестанет вызывать проблемы с вашим выбором.