Я хочу, чтобы программно генерировать щелчок на строке DataGridView в C # - PullRequest
10 голосов
/ 20 августа 2010

У меня есть DataGridView в форме, и я хочу программно щелкнуть его первую строку.Я нашел код для выбора его строк или столбцов из кода.

Например,

datagridview.Columns[0].Selected = true;
datagridview.Rows[0].Selected = true;

Однако этот код не поднимает click event в представлении данных.Если кто-то написал, как щелкнуть сетку в коде, просим вас помочь.

Ответы [ 5 ]

12 голосов
/ 20 августа 2010

Просто вызовите метод обработчика событий, например:

datagridviewRowClickedEventHandler(new object(), new eventargs());

Если вы используете параметры отправителя или e в обработчике событий, вам нужно будет решить, как передать правильные значения.

10 голосов
/ 20 августа 2010

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

private void Form1_Load(object sender, EventArgs e)
{
    //call the cell click event with the first cell as the parameters.
    dataGridView1_CellClick(dataGridView1, new DataGridViewCellEventArgs(0, 0));
}

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
    //put your code for handling cell click here
}
2 голосов
/ 20 августа 2010

Похоже, у вас есть первая половина, установив значение Selected рядов проперов в true. Теперь вы можете программно вызывать обработчик щелчка строки, и он должен продолжаться, как если бы вы щелкнули его в графическом интерфейсе.

0 голосов
/ 12 октября 2017

Я полагаю, вы хотите применить DataSource и выбрать первый ряд? Правильно?

Лучший способ сделать это так

private async void DgvAreas_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e)
{

}

А вот код для симуляции щелчка по строке.

DgvAreas_RowStateChanged(dgvAreas, new DataGridViewRowStateChangedEventArgs(dgvAreas.Rows[0],  DataGridViewElementStates.Selected));

В моем случае у меня есть 3 DataGridView с, поэтому я легко заполняю первый. Второй я заполняю, когда пользователь щелкает первый DataGridView, и в этом случае я использую событие DgvStaff_RowStateChanged.

И в этом случае DgvStaff_RowStateChanged У меня есть код для получения данных async и заполнения третьего DataGridView, и после того, как я применил источник данных для второго DataGridView, мне нужно получить данные для первый ряд этого вида и отобразить его в третьем DataGridView. Это каскадная логика .

private async void DgvStaff_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e)
        {
            try
            {
                // For any other operation except, StateChanged, do nothing
                if (e.StateChanged != DataGridViewElementStates.Selected) return;

                if (sender is MetroFramework.Controls.MetroGrid)
                {
                    if ((sender as MetroFramework.Controls.MetroGrid).SelectedRows.Count > 0)
                    {
                        dgvGeoData.DataSource = null;
                        dgvAreas.DataSource = null;

                        metroProgressSpinnerMain.Visible = true;
                        panelFilter.Enabled = false;

                        dgvAreas.RowStateChanged -= DgvAreas_RowStateChanged;

                        var selectedRow = (sender as MetroFramework.Controls.MetroGrid).SelectedRows[0];
                        var machineModelShortView = (MachineModelShortView)selectedRow.DataBoundItem;

                        var startTime = Convert.ToDateTime(dateTimePickerStart.Value.ToShortDateString());
                        var endTime = Convert.ToDateTime(metroDateTimeEnd.Value.ToShortDateString());
                        var areas = await UpdateAreaItems(machineModelShortView.MachineID, startTime, endTime);

                        if (areas.Any())
                        {
                            BeginInvoke((Action)(() =>
                            {
                                dgvAreas.DataSource = areas.OrderBy(x => x.AreaID).ThenBy(x => x.TimeStart).ToList();
                                dgvAreas.RowStateChanged += DgvAreas_RowStateChanged;

                                // !!! This is how you simulate click to the FIRST ROW dgvAreas.Rows[0]
                                DgvAreas_RowStateChanged(dgvAreas, 
                                    new DataGridViewRowStateChangedEventArgs(dgvAreas.Rows[0],  DataGridViewElementStates.Selected));

                                metroProgressSpinnerMain.Visible = false;
                                panelFilter.Enabled = true;
                            }));
                        }
                        else
                        {
                            BeginInvoke((Action)(() =>
                            {
                                metroProgressSpinnerMain.Visible = false;
                                panelFilter.Enabled = true;
                            }));
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                logger.Error(ex);
            }
        }

А вот

   private async void DgvAreas_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e)
        {
            try
            {
                // For any other operation except, StateChanged, do nothing
                if (e.StateChanged != DataGridViewElementStates.Selected) return;

                //Get GeoData
                if (sender is MetroFramework.Controls.MetroGrid)
                {
                    if ((sender as MetroFramework.Controls.MetroGrid).SelectedRows.Count > 0)
                    {
                        dgvGeoData.DataSource = null;
                        metroProgressSpinnerMain.Visible = true;
                        panelFilter.Enabled = false;

                        var selectedRow = (sender as MetroFramework.Controls.MetroGrid).SelectedRows[0];
                        var areaItem = (AreaItem)selectedRow.DataBoundItem;
                        var geoData = await UpdateWDataPositionItems(areaItem.MachineID, areaItem.TimeStart, areaItem.TimeEnd.Value);

                        if (geoData.Any())
                        {
                            BeginInvoke((Action)(() =>
                            {
                                dgvGeoData.DataSource = geoData.OrderBy(x => x.AtTime).ToList();
                                metroProgressSpinnerMain.Visible = false;
                                panelFilter.Enabled = true;
                            }));
                        }
                        else
                        {
                            BeginInvoke((Action)(() =>
                            {
                                metroProgressSpinnerMain.Visible = false;
                                panelFilter.Enabled = true;
                            }));
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                logger.Error(ex);
            }
        }
0 голосов
/ 17 сентября 2015
datagridview.Columns[0].Selected = true;
datagridview.Rows[0].Selected = true;

Это выглядит как выбранная строка, но не изменится dataGridView.CurrentRow. Так что это может быть проблемой.

dataGridView.CurrentCell = dataGridView[<column>, <row>];

также изменит значение CurrentRow.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...