2011-05-11 79 views
5

根据设计要求,用户无法直接编辑datagridview。它处于只读模式。当用户双击单元格时,datagridview的只读属性将变为false,并且该单元格接受键盘输入。但是,原始键盘输入需要在进入单元格之前进行格式化。因此,我拦截KeyPress事件如下:动态修改时Datagridview单元格值未更新

private void dgw_keyPress(object sender, KeyPressEventArgs e) 
{ 
    e.Handled = true; 
} 

此时单元处于编辑模式和脏模式。然后我用另一种方法更新Value属性,并调用dgw.Refresh(),它应该在单元上显示更新的值。但它不会。它只会在当前单元格不脏并且不处于编辑模式时更新。当它仍处于编辑模式时,如何强制单元格显示更新值?

任何想法?

+0

InvalidateCell()? – Dmitry 2011-05-11 04:44:57

+0

您想要实现的功能不是很清楚,您如何捕获“keypress”事件,然后修改输入并将其分配给网格。请发布所有相关的代码,这不会给出导致问题的whatz的任何见解。 – V4Vendetta 2011-05-11 05:13:45

+0

我试图在没有运气的情况下对datagridview控件执行InvalidateCell()UpdateCellValue()和Refresh()。 我拦截并忽略了控件的关键事件。相反,我有一个记录击键的键盘钩子。我采取由键盘钩子捕获的关键事件,修改值并将它们显示在DGW单元上。 – Thracian 2011-05-11 19:19:49

回答

0

尝试DataGridView.EndEdit方法。

提交并结束当前单元格的编辑操作。

+0

谢谢你的建议,但它没有帮助。我想到了一个解决方法。将焦点移出已编辑的单元格会自动刷新其中的数据。然后我把焦点放回到那个单元,这是现在足够好的解决方案。有一个很小的闪烁,这是唯一的问题。 – Thracian 2011-05-13 14:09:30

11

用如下刷新当前单元格的值,更改以适应您的使用编辑类型

if (dgvMain.EditingControl is TextBox) 
{ 
    dgvMain.EditingControl.Text = dgvMain.CurrentCell.Value.ToString(); 
} 

另一种方法:

调用此方法来强制细胞中更新其显示值编辑 模式。当外部进程修改单元值 并且您想要通知用户该更改时(即使因用户指定的更改而丢失)时,此功能很有用。 details

dgvMain.RefreshEdit(); 
+0

谢谢你的回答。虽然3岁的答案。它帮助我喜欢达到命运。 – 2015-08-25 12:05:50

0

我解决了下面的代码。

GrdBudgetTabOver.EndEdit() 
相关问题