我在editablemode中创建了wxGrid。我注册了以下事件处理程序。
class ReadWriteGrid : public wxGrid
{
public:
ReadWriteGrid(wxWindow *parent, wxWindowID ID,
const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxDefaultSize,
long style=262144, const wxString &name=wxGridNameStr)
: wxGrid(parent, ID, pos, size, style, name)
{
SetEditable();
}
};
EVT_GRID_CELL_CHANGE(IndexTableFrame :: OnEditField)
现在,当用户更改单元格值时,我的函数会在调用完成后被调用。单元格值会更改回旧值。
void IndexTableFrame::OnEditField(wxGridEvent& event)
{
int RowNumber;
int ColNumber;
wxString type;
wxGridCellEditor *m_Editor;
wxString NewValue;
RowNumber = event.GetRow();
ColNumber = event.GetCol();
m_Editor = m_grid->GetDefaultEditorForCell(RowNumber,ColNumber);
NewValue = m_Editor->GetValue();
m_Editor->Destroy();
m_grid->SetCellValue(NewValue,RowNumber,ColNumber);
event.skip();
}
这是我第一次使用WxWidget。我不确定如何避免单元格改回旧值。
答案 0 :(得分:1)
在许多应用程序中,必须在用户更改时动态处理单元格值(例如,根据新单元格值动态更新其他屏幕控件;或者通过以下方式发送数据在更改单元格时立即将串口连接到另一个设备)。
要求用户单击上面建议的单独“保存按钮”并不是许多用例中用户可接受的解决方案。
我可以通过原始海报确认观察结果:如果您创建了一个wxGrid并将wxEVT_GRID_CELL_CHANGED,wxEVT_GRID_CELL_CHANGING或wxEVT_GRID_EDITOR_HIDDEN事件附加到它,则调用grid-> GetCellValue(row,col);返回旧值。处理函数的事件参数也不包含新文本。它看起来像是wxGrid的“特性”。
答案 1 :(得分:0)
你工作太辛苦了!放松一下,让wxGrid承受压力。
最简单的事情就是什么都不做。 wxGrid将接受单元格中的用户编辑并显示更改,而无需执行任何操作。当用户完成后,他可以单击SAVE按钮,您可以在其中实现代码以从单元格中读取值并将其用于您需要的任何内容。
答案 2 :(得分:0)
您应该创建自己的继承自wxGridTableBase的类。
然后你应该使用它的SetTable方法将你的网格表对象附加到wxGrid。
wxGrid对象将使用您的表的方法(GetValue,SetValue)来检索和存储数据。
wxWidgets附带了一个网格示例,可以帮助您了解wxGrid的工作原理。