[英]I want to programmatically generate a click on a DataGridView Row in C#
我在表單中有一個DataGridView
,我想以編程方式單擊它的第一行。 我找到了從代碼中選擇其行或列的代碼。
例如。
datagridview.Columns[0].Selected = true;
datagridview.Rows[0].Selected = true;
但是,此代碼不會在 datagridview 上引發click event
。 如果有人編寫了如何從代碼中單擊 datagridview 的代碼,請擴展您的幫助。
只需調用事件處理程序方法,例如:
datagridviewRowClickedEventHandler(new object(), new eventargs());
如果您在事件處理程序中使用 sender 或 e 參數,那么您將需要弄清楚如何傳入正確的值。
在適當的地方將以下代碼插入到您的項目中(通常在具有 datagridview 的表單上)。
確保將 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
}
看起來您有前半部分,將屬性行Selected
值設置為 true。 現在您可以以編程方式調用行單擊處理程序,它應該像您在 GUI 中單擊它一樣繼續。
datagridview.Columns[0].Selected = true;
datagridview.Rows[0].Selected = true;
它使行看起來像被選中,但它不會改變dataGridView.CurrentRow
。 所以這可能是一個問題。
dataGridView.CurrentCell = dataGridView[<column>, <row>];
也會改變CurrentRow
值。
希望它會有所幫助。
我假設您要應用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
我有代碼來異步獲取數據並填充第三個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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.