2009-06-08 21 views
8

XML直列化を使用してXMLファイルを読み書きするためにDataGridViewコントロールを使用しています。DataGridView - セルから選択が失われない場合、値は保存されません。

以下に説明するように、私は問題を持っている:

  1. 私は、XMLファイルを読み込み、デシリアライズされたオブジェクトとのDataGridViewコントロールを移入します。
  2. セルのDataGridViewのすべての値を更新します。
  3. 私は最後のセルにフォーカスを失うことなく、[名前を付けて保存]オプションを選択します。

この後、特定のセルの値は更新されません。意図的にフォーカスを移動すると(同じグリッド上の別のセルをクリックすると)、値が更新されます。

誰もがこれに対する解決策を提案できますか?

答えて

4

私が正しく理解していれば、セルが編集モードにあり、プログラムで編集をやめてその値を基になるデータソースに渡そうとしていますか?私は私のアプリケーションの一つでそれを行うには、やや「汚い」アプローチを使用してい

if (dataGridView1.CurrentCell.IsInEditMode)  
{  
    int y = dataGridView1.CurrentCellAddress.Y;  
    int x = dataGridView1.CurrentCellAddress.X;  
    if (y > 0)  
     dataGridView1.CurrentCell = dataGridView1.Rows[y - 1].Cells[x];  
    else  
     dataGridView1.CurrentCell = dataGridView1.Rows[y + 1].Cells[x];  
    dataGridView1.CurrentCell = dataGridView1.Rows[y].Cells[x];  
} 

現在のセルが編集モードであるかどうかを最初にチェックコードのその部分。次に、現在のセルをプログラムで変更します(最初の行にある場合は前の行または次の行に変更します)。その後、現在のセル選択を復元します。

"ファイルの名前を付けて保存"ハンドラでこのコードを呼び出します。

+0

ありがとうございます。 –

+0

うれしい私は助けることができます。これをあなたの受け入れられた解決策としてマークできますか? –

15

編集されたセルの値は、検証が完了するまでデータソースにコミットされないためです。これは、セルのフォーカスが失われたときに発生します。あなたはすぐに変更をコミットしたい場合は、CurrentCellDirtyStateChangedイベントを処理し、ハンドラ内にcommitEditメソッドを呼び出すことができます。あなたはまだEditedFormattedValueプロパティのを使用してコミットされていないセルの値を取得することができます

void dataGridView1_CurrentCellDirtyStateChanged(object sender, 
    EventArgs e) 
{ 
    if (dataGridView1.IsCurrentCellDirty) 
    { 
     dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit); 
    } 
} 
+1

これはすごくうまくいった、ありがとう! –

+2

これは私の保存方法では完全に機能します。ありがとう!! –

+0

これはまた私にとってとてもうまくいっています。ありがとう – Abdullah

0

dataGridView1.CurrentCell.EditedFormattedValue 
16

最良の方法は、以下のような現在のセルは、(迅速かつ汚いけれども)NothingにcurrentCell値を割り当てることです。

dgvMyGrid.CurrentCell = Nothing 

をし、その後さらに進行:たとえば

、保存方法で、行います。

+0

私は同じ状況にあり、あなたのソリューションは完璧に機能しました。私はまだこれがどのように可能か疑問に思っています。 – JPReddy

0

私は同じ状況を抱えていましたが、グリッド値を保存するための保存ボタンにアクセラレータキーを使用していました。 DGVから失われたSaveボタンフォーカスをクリックするとセル値が確定しますが、アクセラレータキーを使用するとDGVからフォーカスが失われず、セル値が確定しなくなります。

私はその答えを試してみましたが、好奇心からAmit Karmakarの答えを見て、うまくいきました。私はDGVのデバッグに行きました、そして、それはあなたが保存ボタンクリックでそれを使うなら、何とかうまくいきませんcommiteditと本当に同じことを発見しました。

DGVのCurrentCellをnullに設定する前に、nullに設定する前にDGVは編集された値を取得してセル値にプッシュし、CurrentCell REFERENCEをnullに設定します。ここでは、基底のDGVセルをnullに設定しているということではありません。したがって、これは上記の問題に対して完全に機能します。

注:このソリューションは、セルのイベントを検証していて、ユーザーが無効なデータを入力して検証に失敗すると、完全に機能しない可能性があります。この場合、現在のセルをnullに設定することは、値をセルにプッシュできないため、失敗します。

私はAmit Karmakarの質問に対して、どのように可能かを質問したので、この説明をしました。私はそれが他の人を助けるかもしれないと思ったので、答えとしてこの説明を落としました。

0

OK、これは醜いですが、それは別の行に移動することなく、グリッドからの最終的な変更を取得するために動作します:

With DataGridView1 
    .DataSource = Nothing 
    .DataSource = gridDataTable 
    Dim changedFoo As DataTable = gridDataTable.GetChanges 
End With 

しかし、私はまだアミットKarmakar最高からの回答のように。 DataGridView1 LostFocusイベントに 'DataGridView1.CurrentCell = Nothing'を追加しました。

関連する問題