0

我在可编辑模式下创建了 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。我不确定如何避免单元格变回其旧值。

4

3 回答 3

1

在许多应用程序中,必须在用户更改单元格值时对其进行动态处理(例如,根据新的单元格值动态更新其他屏幕控件;或通过串行端口发送数据更改单元格时立即转移到另一台设备)。

如上所述,要求用户单击单独的“保存按钮”并不是在许多用例中用户可以接受的解决方案。

我可以确认原始海报的观察结果:如果您创建一个 wxGrid 并将 wxEVT_GRID_CELL_CHANGED、wxEVT_GRID_CELL_CHANGING 或 wxEVT_GRID_EDITOR_HIDDEN 事件附加到它,则调用 grid->GetCellValue(row,col); 返回旧值。处理函数的事件参数也不包含新文本。它看起来像 wxGrid 的一个“特性”。

于 2012-10-23T22:01:07.320 回答
0

您应该创建自己的继承自wxGridTableBase的类。

然后您应该使用它的SetTable方法将您的网格表对象附加到 wxGrid 。

wxGrid 对象将使用表的方法(GetValue、SetValue)来检索和存储数据。

wxWidgets 附带了一个网格示例,它将帮助您了解 wxGrid 是如何工作的。

于 2012-12-15T21:43:45.943 回答
0

你太辛苦了!放松,让 wxGrid 承受压力。

最简单的事情就是什么都不做。wxGrid 将接受单元格中的用户编辑并显示更改,而无需您执行任何操作。当用户完成后,他可以单击一个按钮 SAVE,您可以在其中实现代码以从单元格中读取值并将它们用于您需要的任何内容。

于 2012-06-15T14:05:26.520 回答