【问题标题】:The datagridview vertical scrollbar loses its value after I delete a row删除一行后,datagridview 垂直滚动条失去了它的值
【发布时间】:2016-06-22 03:03:57
【问题描述】:

我有一个带有数据表的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 的任何建议和帮助。

【问题讨论】:

  • 删除条目后,您还会看到网格向上滚动 - 现在第一个条目是“caribbean360”。看起来网格真的认为没有更多数据可以显示了。 “caribbean360”是第一个链接,还是“wusfnews”最后一个链接?
  • 我删除了第九行。 “wusfnews”是第10行,是后图中新的第9行。但我仍然无法滚动回顶部。我已经删除了第一行、第二行和中间行,行为相同,删除后滚动条失败。
  • 另外,数据表和gridview的行数在删除前10和删除后9都是正确的。
  • 我跟进了“网格认为没有更多数据”。当数据丢失时,垂直滚动条完全消失。所以它仍然认为有足够的数据进行滚动,但条形图显示不正确。最后,我可以使用光标键在列表中上下滚动。

标签: c# winforms datagridview datatable


【解决方案1】:

试试view.BindingContext = new BindingContext();

重置垂直滚动条范围对我有用。

【讨论】:

    【解决方案2】:

    我无法找出它无法正常运行的原因,但我确实找到了解决方法,以防其他人遇到此问题。基本上在从 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;
        }
    }
    

    【讨论】:

      【解决方案3】:

      对上一个答案的一点代码改进:

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

      适用于两个滚动条

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多