【问题标题】:How to prevent user from entering invalid values in wxGrid cell?如何防止用户在 wxGrid 单元格中输入无效值?
【发布时间】:2013-01-02 14:35:02
【问题描述】:

我想创建 wxGrid,用户可以在其中编辑一些单元格,但禁止输入不正确的值。例如,只能在此处输入长度为 4 的字符串。因此,如果用户输入另一个长度的字符串,我想显示一条错误消息并返回到单元格编辑器。怎么做?

如果我处理一个单元格更改事件EVT_GRID_CELL_CHANGE,例如

void Frame::OnGridCellChange(wxGridEvent& event)
{
    int r = event.GetRow(); // get changed cell
    int c = event.GetCol(); // get changed cell

    if (Grid->GetCellValue(r, c).length() != 4)
       {Error E (this);
          /* Create the Error message */
        E.ShowModal();
          // The error message shown, uses clicks OK

        // So, what to do here? 


}

Grid->ShowCellEditControl(); 不是解决方案,因为如果用户不编辑任何内容,则不会生成单元格更改,而只需单击另一个单元格 - 网格中会出现不正确的值。

处理EVT_GRID_EDITOR_HIDDEN 似乎不合适,因为它出现在新值实际保存到单元格之前。

【问题讨论】:

    标签: c++ events wxwidgets


    【解决方案1】:

    您需要使用自己的单元格编辑器专业化。

    http://docs.wxwidgets.org/trunk/classwx_grid_cell_editor.html

    【讨论】:

      【解决方案2】:

      也许使用wxEVT_GRID_CELL_CHANGING 类型的事件对你有用?如果在事件上调用 GetString() 返回的字符串不是四个字符长,那么您可以否决该事件,例如:

      void Frame::OnGridCellChanging(wxGridEvent& event)
      {
          if (event.GetString().length() != 4)
          {
              //Veto the event so the change is not stored
              event.Veto();
      
              Error E (this);
              E.ShowModal();
      }
      

      不过,这似乎需要 wxWidgets 2.9.x 版本。

      【讨论】:

      • 感谢您的建议,好吧,我还没有准备好使用 2.9.x 版本,但无论如何,最好保留用户输入的数据,但禁止应用单元格编辑,而这种方式好像输入的数据会丢失...
      • 你有旧的和新的字符串,所以保存数据应该不是问题。我怀疑编写自己的从 wxGridCellTextEditor 派生的 wxGridCellEditor 可能是最简单的方法,因为这样您可以在编辑器关闭之前执行验证,因此不会丢失数据但不会写入字符串。
      • 谢谢,这更直接,对我有用。
      猜你喜欢
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-14
      • 2019-01-16
      • 1970-01-01
      • 2023-03-10
      相关资源
      最近更新 更多