Как заставить DataGridView показать выбранную строку?



мне нужно заставить DataGridView для отображения выбранного row.



короче говоря, у меня есть textbox изменения DGV выбор на основе того, что набирается в textbox. Когда это происходит, выбор изменяется на соответствующий row.



к сожалению, если выбрано row находится вне поля зрения, я должен вручную прокрутить вниз, чтобы найти выбор. Кто-нибудь знает, как заставить DGV для отображения выбранного row?



спасибо!

2069   9  

9 ответов:

вы можете установить:

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

здесь Примечание на это имущество.

этот прокручивается до выбранной строки, не помещая ее сверху.

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

рассмотрим также этот код (использует предложенный путь from competent_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;
        }
    }
}

просто поместите эту строку после выбора строки:

dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.SelectedRows[0].Index;
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-выделенная ячейка должна быть видимой

делать что-то вроде этого:

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

будет работать только в том случае, если первый столбец виден. Если он скрыт, вы получите исключение. Это безопаснее:

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

это приведет к сбросу выбора без прокрутки, если целевая строка уже находится на экране. Он также сохраняет текущий выбор столбца, который может иметь значение в тех случаях, когда вы разрешили редактировать.

Я сделал следующую функцию поиска он работает wel для прокрутки выбора на дисплее.

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; 
   }
}

}

обратите внимание, что параметр FirstDisplayedScrollingRowIndex когда ваш DataGridView не включен будет прокручивать список до нужной строки, но полоса прокрутки не будет отражать его положение. Самым простым решением является повторное включение и отключение вашего DGV.

dataGridView1.Enabled = true;
dataGridView1.FirstDisplayedScrollingRowIndex = index;
dataGridView1.Enabled = false;

// это работает, это чувствительно к регистру и находит первое появление search

    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;
    }

Comments

    Ничего не найдено.