2016-11-25 15 views
1

私はdatagridview(dgv)を持っていて、そのためのショートカットをいくつか設定しています。私はdgv selectedIndexChangedのときに私の希望するセルの値を取得したい。
最初のインデックスを変更するとdatagridviewのセル値が得られる

if (dgv.Rows.Count > 0) 
{ 
     lblId.Text = dgv.CurrentRow.Cells[0].Value.ToString(); 
     lblStaffName.Text = dgv.CurrentRow.Cells[1].Value.ToString(); 
     lblStock.Text = dgv.CurrentRow.Cells[4].Value.ToString(); 
} 

と私のDGVのためにいくつかのショートカットを定義した: これは私がselectedIndexChangedイベントのためにやったものです。

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{ 
    if (keyData == (Keys.Alt | Keys.Down)) 
    { 
     if (dgv.Rows.Count > 0) 
     { 
      dgv.Focus(); 
      if (dgv.CurrentRow.Index < (dgv.Rows.Count - 1)) 
      { 
       dgv.Rows[dgv.CurrentRow.Index + 1].Selected = true; 
       dgv.FirstDisplayedScrollingRowIndex = dgv.CurrentRow.Index + 1; 
       pnl.BackColor = Color.FromKnownColor(KnownColor.Lime); 
      } 
     } 
    } 
} 

注:あなたが見ることができるように、私は押したときにAlt+keyDown DGV指数が増加し、より一歩に変更されます。
Alt+keyDownのインデックスを変更してを選択したときに問題が発生しましたが、もう一度Alt+keyDownを押すまで値が変更されません。
私はそこにコードを書かなければならない出来事はありますか?感謝:)

答えて

1

データバインドDataGridViewそれがバインディングコンテキストにこの方法を頼る方が良いでしょうに選択されたインデックスを変更するには:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{ 
    if (keyData == (Keys.Alt | Keys.Down)) 
    { 
     var bc = dgv.BindingContext[dgv.DataSource, dgv.DataMember]; 
     if (bc.Position < bc.Count - 1) 
      bc.Position++; 
     return true; 
    } 
    return base.ProcessCmdKey(ref msg, keyData); 
} 

しかしDataGridViewは、データバインドまたは単に目的を学ぶためではない場合あなたはこのようなコードを書くことができ、あなたのコードを修正したい:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{ 
    if (keyData == (Keys.Alt | Keys.Down)) 
    { 
     if (dgv.CurrentCell == null) 
     { 
      if (dgv.ColumnCount >= 1 && dgv.RowCount >= 1) 
      { 
       dgv.CurrentCell = dgv[0, 0]; 
       return true; 
      } 
     } 
     else 
     { 
      var rowIndex = dgv.CurrentCell.RowIndex; 
      var columnIndex = dgv.CurrentCell.ColumnIndex; 
      if (rowIndex < dgv.RowCount - 1) 
      { 
       dgv.CurrentCell = dgv[columnIndex, rowIndex + 1]; 
       return true; 
      } 
     } 
    } 
    return base.ProcessCmdKey(ref msg, keyData); 
} 

あなたが行の間を移動するためにショートカットを使用する場合、あなたがフォーカスを必要としないので、私はまたdgv.Focus()を削除していますが、何らかの理由でそれを必要とする場合、これを使って。

+0

優れたソリューション。おかげでたくさん:) –

+0

あなたは大歓迎です:) –

関連する問題