// If the DGV does not have Focus prior to a toolbar button Click,
// then the toolbar button will have focus after its Click event handler returns.
// To reliably set focus to the DGV, we need to time it to happen After event handler procedure returns.
private string m_SelectCellFocus_DataPropertyName = "";
private System.Timers.Timer timer_CellFocus = null;
public void CurrentRow_SelectCellFocus(string sDataPropertyName)
{
// This procedure is called by a Toolbar Button's Click Event to select and set focus to a Cell in the DGV's Current Row.
m_SelectCellFocus_DataPropertyName = sDataPropertyName;
timer_CellFocus = new System.Timers.Timer(10);
timer_CellFocus.Elapsed += TimerElapsed_CurrentRowSelectCellFocus;
timer_CellFocus.Start();
}
void TimerElapsed_CurrentRowSelectCellFocus(object sender, System.Timers.ElapsedEventArgs e)
{
timer_CellFocus.Stop();
timer_CellFocus.Elapsed -= TimerElapsed_CurrentRowSelectCellFocus;
timer_CellFocus.Dispose();
// We have to Invoke the method to avoid raising a threading error
this.Invoke((MethodInvoker)delegate
{
Select_Cell(m_SelectCellFocus_DataPropertyName);
});
}
private void Select_Cell(string sDataPropertyName)
{
/// When the Edit Mode is Enabled, set the initial cell to the Description
foreach (DataGridViewCell dgvc in this.SelectedCells)
{
// Clear previously selected cells
dgvc.Selected = false;
}
foreach (DataGridViewCell dgvc in this.CurrentRow.Cells)
{
// Select the Cell by its DataPropertyName
if (dgvc.OwningColumn.DataPropertyName == sDataPropertyName)
{
this.CurrentCell = dgvc;
dgvc.Selected = true;
this.Focus();
return;
}
}
}
7条答案
按热度按时间tag5nh1u1#
设置
CurrentCell
然后调用BeginEdit(true)
对我来说效果很好。下面的代码显示
KeyDown
事件的eventHandler,该事件将单元格设置为可编辑。我的例子只实现了一个必需的按键覆盖,但理论上其他的应该是一样的。(我总是把[0][0]单元格设置为可编辑的,但其他任何单元格都应该可以工作)
如果您以前没有找到DataGridView FAQ,它是一个很好的资源,由DataGridView控件的程序管理器编写,它涵盖了您可能希望使用该控件执行的大多数操作。
yruzcnhs2#
oxosxuxt3#
好吧,我会检查是否有列被设置为
ReadOnly
。我从来没有使用过BeginEdit,但也许有一些合法的用途。一旦您完成了dataGridView1.Columns[".."].ReadOnly = False;
,非ReadOnly
的字段应该是可编辑的。您可以使用DataGridViewCellEnter
事件来确定 * 输入了 * 哪个单元格然后在将编辑从前两列传递到下一组列之后打开对这些单元格的编辑,并关闭对最后两列的编辑。5f0d552i4#
我知道这个问题已经很老了,但是我想分享一些这个问题帮助我的演示代码。
Button
和DataGridView
创建窗体Click
事件CellClick
事件EditMode
设置为EditProgrammatically
请注意,列索引号可以通过多次按下按钮1来更改,因此我总是通过名称而不是索引值来引用列。我需要将大卫霍尔的答案合并到我的演示中,该演示已经有了ComboBox,因此他的答案非常有效。
a6b3iqyw5#
我知道这是一个老问题,但没有一个答案对我有效,因为我想可靠地(总是能够)在可能执行其他事件时将单元格设置为编辑模式,如工具栏按钮点击,菜单选择,这些事件返回后可能会影响默认焦点。我最终需要一个计时器和调用。以下代码位于从DataGridView派生的新组件中。这段代码允许我在任何时候调用
myXDataGridView.CurrentRow_SelectCellFocus(myDataPropertyName);
,任意设置一个数据绑定单元格为编辑模式(假设该单元格不处于只读模式)。ngynwnxp6#
我终于找到了这个问题的答案,在我的例子中,我想在添加新行后选择特定的索引或项,但这应该适用于其他情况。
单元格本身并不包含combobox控件。DGV包含,它包含当前单元格的控件。因此,您必须将当前单元格设置为combo单元格,然后进入编辑模式,然后将dgv控件转换为ComboBox,然后您将可以访问selectedIndex和selectedItem方法
rslzwgfq7#
这个问题是老问题了,但是建议的解决方案对我的情况没有帮助。加载表单时必须选择单元格。此选项不起作用:
如果您在“布局”事件中选择了单元格,则一切都将成功: