2011-12-08 63 views
48

我需要強制DataGridView顯示選定的row如何使DataGridView顯示選定的行?

總之,我有一個textbox,根據輸入到textbox的內容更改DGV選擇。發生這種情況時,選擇將更改爲匹配row

不幸的是,如果選擇的row不在視圖中,我必須手動向下滾動才能找到選擇。有誰知道如何強制DGV顯示選定的row

謝謝!

+7

只需設定CurrentCell屬性,則DGV將滾動,以使其可見的第一次出現。 –

回答

86

您可以設置:

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

下面是這個屬性的MSDN documentation

+0

謝謝!我一直在努力尋找我的邏輯錯誤,因爲我使用的CurrentCell並不普遍。但是我可以將我一直使用的行號插入到這裏,它的功能就像一個魅力! – clweeks

+0

簡單和完美(y) –

10

只要把該行的選擇行後:

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

錯過了一分鐘! –

32

這一個滾動所選行沒有把它放在上面。

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

絕對比'DataGridView.FirstDisplayedScrollingRowIndex'更加用戶友好,謝謝! – Nolonar

+4

與FirstDisplayedScrollingRowInde不同,這也會將行箭頭移動到正確的行,選擇行並取消選擇任何其他行。 – Polyfun

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 - 所選單元格必須是可見

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

}

+0

這是我使用的一個。 – Mac

14

也考慮這個代碼(使用從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; 
     } 
    } 
} 
+3

非常實用的答案......值得更多的選票。 – ulatekh

+1

我同意,所以我有upvoted!它比任何其他解決方案都更好。 – JonP

+2

工程很好 - 我做了rowToShow opptional,並將其設置爲最後一行,如果未由調用者設置。現在它默認滾動到底部。可以添加另一個簽名以給它一個更好的名稱。 – rheitzman

0

請注意,設置FirstDisplayedScrollingRowIndex當你的DataGridView未啓用將滾動列表所需的行,但滾動條不會反映其位置。最簡單的解決方案是重新啓用和禁用DGV。

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

//這工作,它是區分大小寫的,並認爲搜索

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