WPF Datagrid中跳转到特定行

3
有人能帮忙吗?我正在尝试创建一个方法,允许用户键入行号,该方法将“跳转”到该行。例如,当传递行号时。
我正在使用dataTable作为datagird的项源。
用户可以在datagird侧面看到行号。
示例:用户输入第250行,datagrid会移动到该行。
我正在使用WPF datagrid和c# 4.0。
3个回答

5
除了@blindmeis提出的建议之外,还有以下内容。
this._myview.MoveCurrentTo()

新增这一行:

dataGridView.ScrollIntoView(dataGridView.SelectedItem);

0

我使用了ICollectionView的MoveCurrentTo方法。

 this._myview.MoveCurrentTo()

好的一点是,ICollectionView知道排序等操作。

也许您可以告诉我们您的itemssource是什么,以及为什么用户必须知道“索引”行。用户是否要在屏幕上计算行数?还是您希望用户找到Key = 250的行?


抱歉,我在我的问题上添加了额外的注释,用户可以看到行号。 - user101010101
据我所知,这只会移动选择,而不会实际将视图移动到那里。 - H.B.
H.B. 是正确的,我忘记添加 ScrollIntoView 的内容了。不过,如果一个数据网格有 300 行,那么第 250 行始终是相同的,但当我使用排序时,第 250 行的内容会改变 - 如果 user101010101 仍然希望用户跳转到具有更改内容的第 250 行,则我的方法并不是最好的。他应该使用 SelectedIndex。 - blindmeis

0

这应该可以工作:

在将所选项设置为 Blindmeis 建议的方式(或您喜欢的任何方法)之后,使用 myGrid.ScrollIntoView(myGrid.SelectedItem)。请注意,这可能需要根据您的 UI 如何处理网格上的选择进行微调。

或者,一个未经测试的临时解决方案:

protected void JumpToRow(int rowNumber)
{
   if(rowNumber>=0 && myGrid.Items!=null && rowNumber<myGrid.Items.Count)
   {
      var border = VisualTreeHelper.GetChild(myGrid, 0) as Decorator;
      if (border != null)
      {
         var scroll = border.Child as ScrollViewer;
         if (scroll != null) scroll.ScrollToEnd();
         scroll.ScrollToStart();
         for(int i=0;i<rowNumber;++i)
         {
            scroll.LineDown();
         }
      }
   }
}

谢谢,我尝试了你的代码,我的唯一问题是当它滚动时,似乎没有将滚动条向下移动足够。例如,我将rowNumber设置为279,但只移动到33。有什么想法吗? - user101010101
你是使用物理滚动还是逻辑滚动?请参考https://dev59.com/jnA75IYBdhLWcg3w3NHf。笨拙的方法(我猜你已经尝试过了)需要逻辑滚动。 - Esoteric Screen Name
谢谢,我很困惑。包括31在内的任何数字都可以正常工作,但是任何更大的数字都无法跳过31。你有什么想法吗? - user101010101
myGrid.Items.Count是什么?如果您的网格中只有32个项目,则无法跳过第31行(基于0的索引)。如果这不是答案,我认为除非看到更多您的代码,否则我将无法提供更多帮助。 - Esoteric Screen Name
不计滚动计数为370,我真的无法理解发生了什么。我是否需要在我的数据网格中设置任何属性? - user101010101
如果 CanContentScroll=true 不能解决问题,我建议您放弃这种方法,改用 myGrid.ScrollIntoView(myGrid.SelectedItem)。for循环的替代方案只是一个临时的选择,并不是解决这个问题的最佳方法。 - Esoteric Screen Name

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接