web-dev-qa-db-ja.com

選択した行をDataGridViewに表示するにはどうすればよいですか?

選択したDataGridViewを表示するには、rowを強制する必要があります。

つまり、textboxに入力された内容に基づいてDGVの選択を変更するtextboxがあります。これが発生すると、選択は一致するrowに変わります。

残念ながら、選択したrowがビューの外にある場合、選択を見つけるために手動で下にスクロールする必要があります。 DGVに選択したrowを強制的に表示する方法を知っている人はいますか?

ありがとう!

67
kereberos

以下を設定できます。

dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.SelectedRows[0].Index;

このプロパティの MSDNドキュメント は次のとおりです。

116
competent_tech

これは、選択した行を一番上に配置せずにスクロールします。

dataGridView1.CurrentCell = dataGridView1.Rows[index].Cells[0];
46
IgorOliveira

このコードも考慮してください(competitent_techの推奨方法を使用):

private static void EnsureVisibleRow(DataGridView view, int rowToShow)
{
    if (rowToShow >= 0 && rowToShow < view.RowCount)
    {
        var countVisible = view.DisplayedRowCount(false);
        var firstVisible = view.FirstDisplayedScrollingRowIndex;
        if (rowToShow < firstVisible)
        {
            view.FirstDisplayedScrollingRowIndex = rowToShow;
        }
        else if (rowToShow >= firstVisible + countVisible)
        {
            view.FirstDisplayedScrollingRowIndex = rowToShow - countVisible + 1;
        }
    }
}
20
Georg

行を選択した後、その行を追加します。

dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.SelectedRows[0].Index;
10
Fischermaen

DataGridViewが有効になっていないときにFirstDisplayedScrollingRowIndexを設定すると、リストが目的の行にスクロールされますが、スクロールバーはその位置を反映しません。シンプルなソリューションは、DGVを再度有効化および無効化することです。

dataGridView1.Enabled = true;
dataGridView1.FirstDisplayedScrollingRowIndex = index;
dataGridView1.Enabled = false;
1
user3175253
int rowIndex = -1;
foreach (DataGridViewRow row in dataGridView1.Rows)
{
    if (row.Cells[0].Value.ToString().Equals(searchString))
    {
        rowIndex = row.Index;
        break;
    }
}
if (rowIndex >= 0)
{
    dataGridView1.CurrentCell = dataGridView1[visibleColumnIndex, rowIndex];
}

visibleColumnIndex-選択したセルは表示されている必要があります

1
Dobry

//これは機能します。大文字と小文字が区別され、検索の最初の発生を検出します

    private bool FindInGrid(string search)
    {
        bool results = false;

        foreach (DataGridViewRow row in dgvData.Rows)
        {
            if (row.DataBoundItem != null)
            {
                foreach (DataGridViewCell cell in row.Cells)
                {
                    if (cell.Value.ToString().Contains(search))
                    {
                        dgvData.CurrentCell = cell;
                        dgvData.FirstDisplayedScrollingRowIndex = cell.RowIndex;
                        results = true;
                        break;
                    }

                    if (results == true)
                        break;
                }
                if (results == true)
                    break;
            }
        }

        return results;
    }
1
Mac

このようなことをする:

dataGridView1.CurrentCell = dataGridView1.Rows[index].Cells[0];

最初の列が表示されている場合にのみ機能します。非表示の場合、例外が発生します。これはより安全です:

var column = dataGridView1.CurrentCell != null ? dataGridView1.CurrentCell.ColumnIndex : dataGridView1.FirstDisplayedScrollingColumnIndex; dataGridView1.CurrentCell = dataGridView1.Rows[iNextHighlight].Cells[column];

これにより、ターゲット行がすでに画面上にある場合、スクロールせずに選択がリセットされます。また、インライン編集を許可している場合に問題になる可能性がある現在の列の選択を保持します。

0
sgriffin

次の検索機能を作成しました。これは、ディスプレイで選択をスクロールするのに適しています。

private void btnSearch_Click(object sender, EventArgs e)
{
  dataGridView1.ClearSelection();
  string strSearch = txtSearch.Text.ToUpper();
  int iIndex = -1;
  int iFirstFoundRow = -1;
  bool bFound = false;
  if (strSearch != "")
  {
    dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;

    /*  Select All Rows Starting With The Search string in row.cells[1] =
    second column. The search string can be 1 letter till a complete line
    If The dataGridView MultiSelect is set to true this will highlight 
    all found rows. If The dataGridView MultiSelect is set to false only 
    the last found row will be highlighted. Or if you jump out of the  
    foreach loop the first found row will be highlighted.*/

   foreach (DataGridViewRow row in dataGridView1.Rows)
   {
     if ((row.Cells[1].Value.ToString().ToUpper()).IndexOf(strSearch) == 0)
     {
       iIndex = row.Index;
       if(iFirstFoundRow == -1)  // First row index saved in iFirstFoundRow
       {
         iFirstFoundRow = iIndex;
       }
       dataGridView1.Rows[iIndex].Selected = true; // Found row is selected
       bFound = true; // This is needed to scroll de found rows in display
       // break; //uncomment this if you only want the first found row.
     }
   }
   if (bFound == false)
   {
     dataGridView1.ClearSelection(); // Nothing found clear all Highlights.
   }
   else
   {
     // Scroll found rows in display
     dataGridView1.FirstDisplayedScrollingRowIndex = iFirstFoundRow; 
   }
}

}

0
Dappertje