0

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 を使用するのはこれが初めてです。セルが元の値に戻らないようにする方法がわかりません。

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 はユーザーによるセルの編集を受け入れ、何もしなくても変更を表示します。ユーザーが終了したら、[保存] ボタンをクリックして、セルから値を読み取り、必要なものに使用するコードを実装できます。

于 2012-06-15T14:05:26.520 に答える