我想以编程方式在C#中的DataGridView行上生成一个单击#
我在表单中有一个DataGridView
,我希望以编程方式单击它的第一行。我发现代码从代码中选择它的行或列。我想以编程方式在C#中的DataGridView行上生成一个单击#
例如,
datagridview.Columns[0].Selected = true;
datagridview.Rows[0].Selected = true;
但是,这段代码没有引发datagridview上的click event
。如果任何人编码了如何从代码中点击datagridview,请扩展您的善意帮助。如果你使用发件人或E参数在事件处理程序,那么你将需要解决如何在正确的价值观传递
只需调用事件处理方法例如为:
datagridviewRowClickedEventHandler(new object(), new eventargs());
。
它看起来像你的前半部分,将行数Selected
的值设置为true。现在,您可以通过编程方式调用行单击处理程序,并且应该像在GUI中单击它一样继续。
将follwing代码插入项目中(通常在具有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
}
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);
}
}
我相信我没有正确理解你的问题......但我会问还是老样子 - 为什么不干脆直接打电话给你的点击事件处理方法? – InSane 2010-08-20 16:09:22
谢谢你们,这段代码就像魅力一样。 – 2010-08-20 17:16:04