Як змусити DataGridView відображати вибраний рядок?


78

Мені потрібно змусити DataGridViewпоказати вибране row.

Коротше кажучи, у мене є програма, textboxяка змінює DGVвиділення на основі того, що введено в textbox. Коли це трапляється, виділення змінюється на відповідність row.

На жаль, якщо вибране rowпоза зоною, мені доведеться вручну прокрутити вниз, щоб знайти виділення. Хтось знає, як змусити DGVпоказати вибране row?

Дякую!


9
Просто встановіть властивість CurrentCell, DGV прокрутить, щоб зробити його видимим.
Ганс Пасант,

Відповіді:


137

Ви можете встановити:

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

Ось документація MSDN щодо цієї властивості.


Дякую! Я намагався знайти свою логічну помилку у використанні CurrentCell, яке не працювало універсально. Але я можу підключити до цього номер рядка, який я весь час використовував, і це працює як шарм!
clweeks

просто і досконало (y)
Ахмед Абделькадер

50

Цей прокручується до вибраного рядка, не кладучи його зверху.

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

3
Безумовно, більш зручний, ніж DataGridView.FirstDisplayedScrollingRowIndex, дякую!
Нолонар

6
На відміну від FirstDisplayedScrollingRowInde, це також переміщує стрілку рядка до правильного рядка, виділяє рядок і скасовує вибір будь-якого іншого рядка.
Поліфун

dataGridView1.CurrentCell = dataGridView1.SelectedRows[0].Cells[0]
Mahmoodvcs

1
Однак, якщо перший стовпець був прихований, це ВИКЛАДАЄ виняток.
sgriffin

27

Розглянемо також цей код (використовує запропонований шлях від expert_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;
        }
    }
}

3
Дуже функціональна відповідь ... варта набагато більше голосів.
ulatekh

1
Я згоден, тому я підтримав його! Це працює краще, ніж будь-яке інше рішення.
JonP

3
Чудово працює - я зробив rowToShow необов’язковим і встановив його на останній рядок, якщо не встановлений абонентом. Тепер він прокручується донизу за замовчуванням. Можна додати ще один підпис, щоб дати йому кращу назву.
rheitzman

1
Дякую. Це працює набагато краще, ніж інші відповіді. Порада іншим користувачам: я трохи змінив його для передачі у firstVisible, оскільки мій список також оновлювався до того, як мені потрібно було викликати EnsureVisibleRow (після оновлення вмісту DataGridView FirstDiaplayedScrollingRowIndex завжди скидався до нуля, тому мені довелося зберегти його перед оновленням)
Брайан О Керролл

Невелика помилка: умовою має бути: else if (rowToShow >= firstVisible + countVisible - 1) (Я щойно написав те саме рішення, бо пропустив цю відповідь!)
PW


1
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

Зверніть увагу, що встановлення FirstDisplayedScrollingRowIndex, коли ваш DataGridView не ввімкнено, прокрутить список до потрібного рядка, але смуга прокрутки не відображатиме його положення. Найпростішим рішенням є повторне ввімкнення та вимкнення вашого DGV.

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

1

// Це працює, чутливо до регістру та знаходить першу появу пошуку

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

0

Робимо щось подібне:

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

Я зробив наступну функцію пошуку, яка працює добре, для прокрутки виділень на дисплеї.

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

}


Це я використовую.
Mac
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.