Как сохранить положение после перезагрузки DataGridView

это - мой код:

        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?

16
задан Will Marcouiller 14 March 2010 в 15:09
поделиться

4 ответа

На другом форуме я нашел решение без каких-либо манипуляций:

    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");
    }
1
ответ дан 30 November 2019 в 15:47
поделиться

Это происходит потому, что вы сбрасываете или заново воздействуете на свойство 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; 
0
ответ дан 30 November 2019 в 15:47
поделиться

Вы можете сохранить выбранную строку перед запуском getData, используя DataGridView.CurrentRow , и выбрать эту строку после загрузки сетки.

В на этот вопрос я ответил, как выбрать конкретную строку в DataGridView.


Edit: Я предполагал, что вы используете WinForms

Edit2: А что насчет полос прокрутки?

Вы также можете сохранить индекс первой видимой строки с помощью этого оператора

DataGridView.FirstDisplayedCell.RowIndex
3
ответ дан 30 November 2019 в 15:47
поделиться

В настоящее время вы загружаете данные каждый раз при загрузке страницы. Я бы предложил использовать свойство Page.IsPostback, чтобы проверить, является ли это обратной передачей или нет.

if(!Page.IsPostback)
{
    dataGridView1.DataSource = bindingSource;  
    getData("SELECT * FROM cities");
}

Это снизит нагрузку на вашу БД и перестанет вызывать проблемы с вашим выбором.

0
ответ дан 30 November 2019 в 15:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: