I assume you want to apply a DataSource and select the first row? Correctly?
Best way to do it like this
private async void DgvAreas_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e) { }
And here is the code to simulate a click on a line.
DgvAreas_RowStateChanged(dgvAreas, new DataGridViewRowStateChangedEventArgs(dgvAreas.Rows[0], DataGridViewElementStates.Selected));
In my case, I have 3 DataGridView , so I easily populate the first one. The second one I populate when the user clicks the first DataGridView, in which case I use the DgvStaff_RowStateChanged event.
And in this case, DgvStaff_RowStateChanged , I have code to get async data and fill out the third DataGridView , and after applying the data source for the second DataGridView I need to get the data for the first row of this view and display it in the third DataGridView . This is cascading logic .
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); } }
And here
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); } }
Academy of programmer
source share