簡體   English   中英

刪除一行后,datagridview 垂直滾動條失去其值

[英]The datagridview vertical scrollbar loses its value after I delete a row

我有一個帶有數據表的 datagridview 作為 tabcontrol 內的數據源。 我用 10 行數據加載數據表,然后設置數據源。 每當我從 datagridview 或數據源數據表中刪除一行時,datagridview 上的垂直滾動條就會丟失其設置。 我從數據表中嘗試過:

DataTable dataTableCopy = ((DataSet)dgvFeedItems.DataSource).Tables[0];
for (int i = 0; i < dataTableCopy.Rows.Count - 1; i++)
{
    if (dataTableCopy.Rows[i][0].ToString() == FeedItemID.ToString())
    {
        dataTableCopy.Rows[i].Delete();
        break;
    }
}
dataTableCopy.AcceptChanges();

我直接從網格中嘗試過:

 foreach (DataGridViewRow dgvrFeedItem in dgvFeedItems.Rows)
 {
     if (dgvrFeedItem.Cells[1].Value.ToString().Equals(FeedItemID.ToString()))
     {
          dgvFeedItems.Rows.Remove(dgvrFeedItem);
          break;
     }
 }

兩種方法的結果都是一樣的。

前:

行刪除前

后:

行刪除后

在這兩種情況下,表格都有正確的行數,但垂直滾動條消失了。 TY 的任何建議和幫助。

嘗試view.BindingContext = new BindingContext();

重置垂直滾動條范圍對我有用。

我無法找出它無法正常運行的原因,但我確實找到了解決方法,以防其他人遇到此問題。 基本上從 DataTable 中刪除行后,datagridview 內的垂直滾動條被禁用。 因此,作為一種解決方法,我在 datagridview 中找到了垂直滾動條控件,存儲其位置,更新數據表,重新啟用垂直滾動條,然后重新定位垂直滾動條,因為它的設置在禁用時丟失了。

VScrollBar vsbFeedGrid = null;
// The vscrollbar index is 1 in this.dgvFeedItems.Controls but I loop in case it isnt always in that position
foreach (Control control in this.dgvFeedItems.Controls)
{
    if (control is VScrollBar)
    {
        vsbFeedGrid = (VScrollBar)control;
        break;
    }
}

if (vsbFeedGrid != null)
{
    int intCurrentVPosition = vsbFeedGrid.Value;  // Store current scroll position

    DeleteItemFromFeedGrid(lngFeedItemID);  // Update datatable

    vsbFeedGrid.Enabled = true;             //Re-enable the vertical scrollbar

    if (intCurrentVPosition > vsbFeedGrid.Maximum)  //Re-position the vertical scrollbar
    {
        vsbFeedGrid.Value = vsbFeedGrid.Maximum;  // In case it was the last record deleted
    }
    else
    {
        vsbFeedGrid.Value = intCurrentVPosition;
    }
}

對先前答案的一些代碼改進:

foreach(var sb in grid.Controls.OfType<ScrollBar>())
{
    int intCurrentPosition = sb.Value;
    sb.Enabled = true;
    if (intCurrentPosition > sb.Maximum)
        sb.Value = sb.Maximum;
    else
        sb.Value = intCurrentPosition;
}

適用於兩個滾動條

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM