2017-07-26 223 views
1

私のアプリケーションでは、コードdgvCases.ClearSelection()を使用してすべての行を選択解除しました。視覚的には何も選択されていませんが、実際には最初の行が選択されます。ここで選択した行の "id"列から値を取得するコードです。DataGridView.ClearSelection()が正常に動作しない

Try 
    caseId = dgvCases.Item("Id", dgvCases.CurrentRow.Index).Value 
    MsgBox(caseId) 
Catch ex As Exception 
    MsgBox("Please select a row", MsgBoxStyle.Information) 
End Try 

望ましくない最初の行から「id」を取得しています。だから何がうまくいかず、どのようにして最初の行からでも実際に選択をクリアすることができます。 DataGridView.ClearSelection上のMSDNドキュメント、強調鉱山から

+0

デフォルトでは、 'caseid'は0ですか? 'try catch 'の代わりに' if else statement'を使うことができます。また 'caseid'はユーザーがデータグリッドをクリックすると値を持つことができますので、' cellclick'のようなイベントを追加して、 'datagrid'をクリックすると値を割り当てますあなたの 'caseid'に私はそれがあなたの問題を解決すると思います – Muj

答えて

2

すべて選択したセルの選択を解除すると、現在の選択をクリアします。何が実際に選択されていないので

は今、視覚的には何もを選択されていません」。おそらくCurrentRow.Indexを使用して、選択した行から値を取得しています。しかし、CurrentRowCurrentCellは、行/セルがSelectedであることと同じではありません。これはcommon misconceptionです。上記連結回答のコメント欄から

CurrentCell「が選択された」とは異なる「アクティブ」セルを返します。たとえ複数の行が選択されていても、アクティブなセルは別の場所にある可能性があります。アクティブなセルは1つだけです - Luke Marlin

また、データグリッドビューのすべてを選択解除しても、セルはまだアクティブなので、選択されている行がないため、nullまたはこれに頼ることはできません。 - ダニエル・グレー

あなたの最善の策は、あなたの選択をクリアした後

caseId = dgvCases.Item("Id", dgvCases.SelectedRows(0).Index).Value 

caseId = dgvCases.Item("Id", dgvCases.CurrentRow.Index).Value 

を交換することで、これはあなたのcatchブロックをトリガします。サイドノート:Use if/else instead of try/catchは、選択された行があることを確認します。

関連する問題