Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ wxGrid在用户编辑单元格后显示旧值而不是新值_C++_Visual C++_Wxwidgets - Fatal编程技术网

C++ wxGrid在用户编辑单元格后显示旧值而不是新值

C++ wxGrid在用户编辑单元格后显示旧值而不是新值,c++,visual-c++,wxwidgets,C++,Visual C++,Wxwidgets,我在editablemode中创建了wxGrid。我注册了以下事件处理程序 class ReadWriteGrid : public wxGrid { public: ReadWriteGrid(wxWindow *parent, wxWindowID ID, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxDefaultSize, long style=2621

我在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网格单元格更改(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。我不知道如何避免单元格变回原来的值。

您工作太辛苦了!放松,让wxGrid承受压力

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();   
   }

最简单的事情就是什么也不做。wxGrid将接受用户在单元格中的编辑并显示更改,而无需您执行任何操作。当用户完成后,他可以单击“保存”按钮,在该按钮中,您可以执行代码从单元格中读取值,并将其用于您需要的任何用途。

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

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


我可以通过原始海报确认观察结果:如果创建wxGrid并将wxEVT_GRID_CELL_CHANGED、wxEVT_GRID_CELL_CHANGED或wxEVT_GRID_EDITOR_HIDDEN events附加到wxGrid->GetCellValue(行、列);返回旧值。处理程序函数的事件参数也不包含新文本。它看起来像wxGrid的“功能”。

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

然后,应该使用wxGrid的方法将grid表对象附加到wxGrid

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


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

,是的,我什么也没做。附加到此网格的表非常复杂。用户编辑网格中的单元格值后,更改不会传递到下面的表。失去焦点后,网格调用getcellvalue(行,列)返回从文件读取的原始值的表。然后我相信问题在于您“附加”表的方式。如果您这样做正确,那么wxWidgets框架应该为您处理这些事情。但是,这是非常高级的东西,我不是这方面的专家。