如何使DataGridView显示所选行?


77

我需要强制DataGridView显示所选内容row

简而言之,我有一个textboxDGV根据键入的内容更改选择textbox。发生这种情况时,选择将更改为match row

不幸的是,如果所选row内容不在视图中,我必须手动向下滚动才能找到所选内容。有谁知道如何强制DGV显示所选内容row

谢谢!


9
只需设置CurrentCell属性,DGV就会滚动以使其可见。
汉斯·帕桑

Answers:


133

您可以设置:

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

这是有关此属性的MSDN文档


谢谢!我一直在努力尝试在无法普遍使用的CurrentCell的使用中发现自己的逻辑错误。但是我可以将一直使用的行号插入此行号,它的工作原理就像一个魅力!
clweeks 2014年

简单和完美(y)
艾哈迈德·阿卜杜勒·卡德尔

50

此滚动条滚动到所选行,而不放在最上面。

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

3
绝对比更加用户友好DataGridView.FirstDisplayedScrollingRowIndex,谢谢!
Nolonar

6
与FirstDisplayedScrollingRowInde不同,这还会将行箭头移动到正确的行,选择行,然后取消选择任何其他行。
Polyfun

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

1
但是,如果第一列已隐藏,则将抛出异常。
sgriffin

27

还考虑以下代码(使用来自于主管技术建议的方式):

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,因为在我需要调用SecureVisibleRow之前,我的列表也已刷新(刷新DataGridView内容后,FirstDiaplayedScrollingRowIndex始终重置为零,因此必须在刷新之前保存它)
Brian O Carroll

小错误:情况应该是:(else if (rowToShow >= firstVisible + countVisible - 1)我写了相同的解决方案,因为我错过了此答复!)
PW

11

只需在选择该行之后放置该行:

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

1
一分钟错过了它!
Alex Jorgenson

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

请注意,如果未启用DataGridView ,则设置FirstDisplayedScrollingRowIndex会将列表滚动到所需的行,但是滚动条不会反映其位置。最简单的解决方案是重新启用和禁用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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.