簡體   English   中英

我想以編程方式在 C# 中生成對 DataGridView 行的點擊

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM