- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个像这样的 DataGridView:
现在,在 C# 或 VB.Net 中,我想通过一个按钮将所选行向上或向下移动一个位置,我该怎么做?。多重选择的要求使我变得复杂。
出现在DataGridView中的文件将合并为一个可执行文件,然后,这些文件将按照“Order”列的顺序执行,所以“Order "向上或向下移动行时,值应该是不可变的。
我没有使用任何数据源。
我已经尝试分析来自 MSDN 的这个示例,它包含一些扩展方法,但它需要一个数据表和数据源,我对使用数据表和数据源没有任何失望但是只是我不知道如何为我的 DataGridView 调整代码示例。无论如何,示例不支持多选:
Move rows up/down and remember order for DataGridView and ListBoxs data bound
我还在 StackOverflow 上看到了一些关于此的 C# 问题,但他们要求选择单行:
How to move gridview selected row up/down on KeyUp or Keydown press
DataGridView Selected Row Move UP and DOWN
然后,我没有起点,只有这些方法来移动也不保留 Order 值的 SINGLE 行,如果有人可以指导我扩展我需要的功能: Private Sub Button_MoveUp_Click(sender As Object, e As EventArgs) _ 处理 Button_MoveUp.Click
Me.MoveUpSelectedRows(Me.DataGridView_Files)
End Sub
Private Sub Button_MoveDown_Click(sender As Object, e As EventArgs) _
Handles Button_MoveDown.Click
Me.MoveDownSelectedRows(Me.DataGridView_Files)
End Sub
Private Sub MoveUpSelectedRows(ByVal dgv As DataGridView)
Dim curRowIndex As Integer = dgv.CurrentCell.RowIndex
Dim newRowIndex As Integer = curRowIndex - 1
Dim curColIndex As Integer = dgv.CurrentCell.ColumnIndex
Dim curRow As DataGridViewRow = dgv.CurrentRow
If (dgv.SelectedCells.Count > 0) AndAlso (newRowIndex >= 0) Then
With dgv
.Rows.Remove(curRow)
.Rows.Insert(newRowIndex, curRow)
.CurrentCell = dgv(curColIndex, newRowIndex)
End With
End If
End Sub
Private Sub MoveDownSelectedRows(ByVal dgv As DataGridView)
Dim curRowIndex As Integer = dgv.CurrentCell.RowIndex
Dim newRowIndex As Integer = curRowIndex + 1
Dim curColIndex As Integer = dgv.CurrentCell.ColumnIndex
Dim curRow As DataGridViewRow = dgv.CurrentRow
If (dgv.SelectedCells.Count > 0) AndAlso (dgv.Rows.Count > newRowIndex) Then
With dgv
.Rows.Remove(curRow)
.Rows.Insert(newRowIndex, curRow)
.CurrentCell = dgv(curColIndex, newRowIndex)
End With
End If
End Sub
UPDATE
我正在尝试@Plutonix 方法(稍作修改),唯一的问题是它没有正确地将选定的行移动到向上方向。
重现问题的步骤:
选择在一起的两行(例如,行索引 2 和行索引 3,而不是行索引 2 和行索引 4)
尝试将行向上移动。
我该如何解决?
Public Enum MoveDirection As Integer
Up = -1
Down = 1
End Enum
Private Sub MoveRows(ByVal dgv As DataGridView, ByVal moveDirection As MoveDirection)
Dim rows As DataGridViewRowCollection = dgv.Rows
' row index
Dim thisRow As DataGridViewRow
' put selection back
Dim selectedRows As New List(Of Integer)
' max rows
Dim lastRowIndex As Integer =
If(dgv.AllowUserToAddRows,
rows.Count - 2,
rows.Count - 1)
For n As Integer = lastRowIndex To 0 Step -1
If Not rows(n).IsNewRow Then
If rows(n).Selected Then
selectedRows.Add(n)
MsgBox(n)
Select Case moveDirection
Case Main.MoveDirection.Down
If ((n + moveDirection) <= lastRowIndex) AndAlso (n + moveDirection >= 0) AndAlso rows(n + moveDirection).Selected = False Then
selectedRows(selectedRows.Count - 1) = (n + moveDirection)
thisRow = rows(n)
rows.Remove(thisRow)
rows.Insert(n + moveDirection, thisRow)
End If
Case Main.MoveDirection.Up
If ((n + moveDirection) <= lastRowIndex) Then
MsgBox(selectedRows(selectedRows.Count - 1))
selectedRows(selectedRows.Count - 1) = (n + moveDirection)
thisRow = rows(n)
rows.Remove(thisRow)
rows.Insert(n + moveDirection, thisRow)
End If
End Select
End If
End If
Next n
' reselect the original selected rows
For n As Integer = 0 To lastRowIndex
dgv.Rows(n).Selected = selectedRows.Contains(n)
' renumber the order (optional & unknown, but trivial)
dgv.Rows(n).Cells(0).Value = (n + 1)
Next n
End Sub
最佳答案
(更新)
您需要迭代行集合,测试是否每个都被选中,然后交换行。为了防止 2 个选定的行在到达顶部或底部时相互交换,需要一个单独的 Up 和 Down 方法。
' list of hash codes of the selected rows
Private Function GetSelectedRows() As List(Of Integer)
Dim selR As New List(Of Integer)
' have to clear selected so the NEXT row
' doesnt cause odd behavior
For n As Integer = 0 To dgv.Rows.Count - 1
If dgv.Rows(n).IsNewRow = False AndAlso dgv.Rows(n).Selected Then
selR.Add(dgv.Rows(n).GetHashCode)
dgv.Rows(n).Selected = False
End If
Next
Return selR
End Function
' restore original selected rows
Private Sub SetSelectedRows(selRows As List(Of Integer))
For n As Integer = 0 To dgv.Rows.Count - 1
If dgv.Rows(n).IsNewRow = False Then
dgv.Rows(n).Selected = selRows.Contains(dgv.Rows(n).GetHashCode)
' reset Order col:
dgv.Rows(n).Cells(0).Value = n + 1
End If
Next
End Sub
Private Sub MoveRowsUp()
' short ref
Dim rows As DataGridViewRowCollection = dgv.Rows
' row index
Dim thisRow As DataGridViewRow
' put selection back
Dim selectedRows As List(Of Integer)
' max rows
Dim LastRow = If(dgv.AllowUserToAddRows, rows.Count - 2, rows.Count - 1)
selectedRows = GetSelectedRows()
For n As Int32 = 0 To LastRow
If rows(n).IsNewRow = False Then
If (selectedRows.Contains(rows(n).GetHashCode)) AndAlso (n - 1 >= 0) AndAlso
(selectedRows.Contains(rows(n - 1).GetHashCode) = False) Then
thisRow = rows(n)
rows.Remove(thisRow)
rows.Insert(n - 1, thisRow)
End If
End If
Next
SetSelectedRows(selectedRows)
End Sub
Private Sub MoveRowsDn()
Dim rows As DataGridViewRowCollection = dgv.Rows
Dim thisRow As DataGridViewRow
Dim selectedRows As New List(Of Integer)
Dim LastRow = If(dgv.AllowUserToAddRows, rows.Count - 2, rows.Count - 1)
selectedRows = GetSelectedRows()
For n As Int32 = LastRow To 0 Step -1
If rows(n).IsNewRow = False Then
If (selectedRows.Contains(rows(n).GetHashCode)) AndAlso (n + 1 <= LastRow) AndAlso
(selectedRows.Contains(rows(n + 1).GetHashCode) = False) Then
thisRow = rows(n)
rows.Remove(thisRow)
rows.Insert(n + 1, thisRow)
End If
End If
Next
SetSelectedRows(selectedRows)
End Sub
用法:
MoveRowsUp()
' move down:
MoveRowsDn()
移动行会导致 dgv 重置选择。这些方法首先获取所选行的 HashCode 列表,然后在最后根据该列表重置每个 Row.Selected
属性。
代码更改 Cell(0) 的值,因此订单和订单列匹配(这意味着订单列值是可变的)。
如果此行位于末尾或如果目标行也被选中,则移动检查两者。这可以防止行在到达顶部或底部时交换位置。
之前:
之后:
请注意,当“Zalgo”到达底部(意味着选择了 3 和 5)时,另一个仍然可以向下移动一个,所以它会这样做,而“Ziggy”则留在原地。 “Ziggy(3)”是否向下移动的能力取决于下一行/索引(仅)- 下一行不超出底部 AND 未被选中,因此它仍然可以向下移动1,而“Zalgo (5)”则不能。
关于c# - 通过多选向上或向下移动复杂的 DataGridView 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30832922/
我正在使用面部跟踪进行 HCI(人机交互)。我正在尝试使用面部控制 PC。 我有 3x3 二维网格按钮。1 2 34 5 67 8 9 假设,当前焦点在按钮 5 上。如果我按向上箭头,则焦点将在 2
我正在为蛇和梯子制作一 block 板,到目前为止,我已经按降序打印了板。但是,我需要以正确的方式打印电路板。 编辑“螺旋下降”意味着 100...91 81...90 80...71 ...
我有一个可以响应式调整大小的菜单,因此每次调整大小时 div (#menuWFhover) 的内容都会重新排列,因此 div 根据窗口大小具有不同的高度。 当我使用 jQuery slideDown/
我们从服务器获取数据并附加 ListView 。我们的问题是,当向上/向下滚动时,它首先显示白屏,然后显示数据。向下/向上滚动时,之前出现的白屏应删除 for (var i=0; i");
我想要一个汉堡图标动态改变颜色的代码,以适应网站的黑色部分/部分和白色。它最初是 3 段白色,js 代码几乎是好的和正确的,但是当它在白色部分时它一直闪烁,并在红色和白色之间闪烁。 js var to
我对点击事件的页脚位置有疑问。我正在使用 bootstrap css,我有一个可折叠元素(bootstrap 中的 Accordion ),当它折叠时它有一个名为 .accordion-toggle.
在此代码段中,使用关键帧和动画并显示无/ block ,div 动画以在悬停时向下滑动。 h1 { padding: 20px; } div { width: 100%; background
我需要对一个 float 进行四舍五入。例如 4.00011 。内置函数 round() 总是在数字 > .5 时向上舍入,在 = 0 val *= 10 ** precision r
我正在尝试就地缩小文件。 我正在用另一个文件的内容替换一个文件的内容,完成后我想确保源文件是否小于目标文件,目标文件是否正确收缩。 (为什么:因为dest文件是一个备份,写入media的开销很大,所以
似乎每当我用一个负整数除以一个正整数时,我都需要它向下舍入 (向 -inf),而不是向 0。但 C# 和 C++ 都向 0 舍入。 所以我想我需要一个 DivideDownward() 方法。我可以用
考虑这个简单的代码: document.addEventListener( 'keypress', function() { console.log( 'press' ); } ); document
有什么方法可以检查 Azure 资源(例如 Azure IoT 中心或事件中心)是否可用。我所说的可用是指它是否已关闭/工作/正常/启动?我是 Azure 的新手,如果有人能提供一些启发,那就太好了。
有什么方法可以检查 Azure 资源(例如 Azure IoT 中心或事件中心)是否可用。我所说的可用是指它是否已关闭/工作/正常/启动?我是 Azure 的新手,如果有人能提供一些启发,那就太好了。
我见过几个recyclerview的无限滚动示例,但它们都是向下滚动的。 我想要的是一次又一次地加载我的列表,但无论用户是从上面还是从下面滚动。 正常列表 向上滚动 向下滚动 这样可以通过无限滚动一遍
我正在使用带有 View 的 drupal 7,并且我正在使用我发现的向上/向下文本幻灯片的 jquery 脚本。它有效,但是当我尝试将它与带有 ajax 的 View 公开过滤器一起使用时,它似乎不
*场景 我希望制作一个类似于本网站上的 jquery 效果,它位于主 Flash 添加的右侧: http://www.commbank.com.au/ *问题 我已经开始了,但是用很多方法遇到了一些障
互联网。如果这与其他人没有什么关系,请原谅我,但我会将其留在这里,以防这是一个有效的问题。 我正在尝试创建一个文本区域字段,其中用户每次按下键(a-z),都会触发背景颜色更改(在数组中列出)。我一直在
我正在创建一个网络前端来控制一个小型机器人。 Ajax 调用将在 keydown 上进行,以启动机器人,并在 keyup 上进行停止。 我的问题是,当按下某个键时,keyup、keydown 和 ke
我在内容容器中有两个 div,一个向左浮动,另一个向右浮动。我正在使用屏幕的整个宽度。左 div 宽度为 1290px,右 div 宽度为 625px。有时,在加载页面时,滚动条会更改可用屏幕宽度的宽
请看这个UI sketch图片,我在某个站点的侧边栏(黑框)中有这个 div,当我向下滚动或向上滚动时,我不希望它隐藏...我希望它在我向下滚动和移动时自行向下移动当我向上滚动时向上滚动,这样它就永远
我是一名优秀的程序员,十分优秀!