You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中实现Telerik RadGridView选中行上下移动及上下键跳转行?

实现Telerik RadGridView选中行上下移动与按键导航

刚好之前做过类似的需求,给你详细说说怎么实现这两个功能:

一、用上下箭头按键快速跳转选中行

其实RadGridView默认就支持上下箭头切换选中行,但如果你的场景里默认行为被覆盖,或者需要自定义跳转逻辑,可以通过监听KeyDown事件来实现:

private void radGridView1_KeyDown(object sender, KeyEventArgs e)
{
    var grid = sender as RadGridView;
    if (grid == null || grid.Rows.Count == 0) return;

    switch (e.KeyCode)
    {
        case Keys.Up:
            // 计算上一行索引,避免越界
            int prevIndex = grid.CurrentRow.Index - 1;
            if (prevIndex >= 0)
            {
                grid.CurrentRow = grid.Rows[prevIndex];
                grid.Rows[prevIndex].IsSelected = true;
                grid.ScrollToRow(prevIndex); // 确保行在可视区域内
            }
            e.Handled = true; // 可选:阻止默认行为,避免冲突
            break;
        case Keys.Down:
            int nextIndex = grid.CurrentRow.Index + 1;
            if (nextIndex < grid.Rows.Count)
            {
                grid.CurrentRow = grid.Rows[nextIndex];
                grid.Rows[nextIndex].IsSelected = true;
                grid.ScrollToRow(nextIndex);
            }
            e.Handled = true;
            break;
    }
}

注意:如果你的GridView启用了分组、过滤或者有隐藏行,建议改用grid.ChildRows来处理,确保选中的是可见行。

二、实现选中行的上下移动(调整行顺序)

这个功能需要操作绑定的数据源(RadGridView的行顺序由数据源决定),推荐用BindingList<T>作为数据源,它能自动通知UI更新,不需要重新绑定。

1. 编写通用的行移动方法

private void MoveSelectedRow(bool moveUp)
{
    var grid = radGridView1;
    if (grid.SelectedRows.Count == 0) return;

    // 结束编辑状态,避免数据丢失
    grid.EndEdit();

    var selectedRow = grid.SelectedRows[0];
    int currentIndex = selectedRow.Index;
    int targetIndex = moveUp ? currentIndex - 1 : currentIndex + 1;

    // 边界判断:不能超出数据源范围
    if (targetIndex < 0 || targetIndex >= grid.Rows.Count) return;

    // 获取数据源(替换成你的实际数据模型类型)
    var dataSource = grid.DataSource as BindingList<YourModel>;
    if (dataSource == null) return;

    // 交换数据源中的元素位置
    YourModel tempItem = dataSource[currentIndex];
    dataSource[currentIndex] = dataSource[targetIndex];
    dataSource[targetIndex] = tempItem;

    // 重新选中移动后的行,并滚动到可视区域
    grid.CurrentRow = grid.Rows[targetIndex];
    grid.Rows[targetIndex].IsSelected = true;
    grid.ScrollToRow(targetIndex);
}

2. 触发移动操作

你可以通过两种方式触发:

  • 按钮点击:给“上移”“下移”按钮绑定点击事件
private void btnMoveUp_Click(object sender, EventArgs e)
{
    MoveSelectedRow(true);
}

private void btnMoveDown_Click(object sender, EventArgs e)
{
    MoveSelectedRow(false);
}
  • 快捷键触发:在之前的KeyDown事件里添加Ctrl+Up/Ctrl+Down的判断
// 加到之前的switch语句里
case Keys.Up when e.Control:
    MoveSelectedRow(true);
    e.Handled = true;
    break;
case Keys.Down when e.Control:
    MoveSelectedRow(false);
    e.Handled = true;
    break;

额外提示:如果用普通List<T>作为数据源,修改后需要重新绑定(grid.DataSource = null; grid.DataSource = yourList;),但会丢失选中状态,所以更推荐BindingList<T>。如果需要处理多行选中移动,你可以遍历选中行,依次调整它们的位置。

内容的提问来源于stack exchange,提问作者user6648166

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:37:06