【问题标题】:How to make sortable a DataGrid bounded with a table如何使以表为界的 DataGrid 可排序
【发布时间】:2016-11-06 11:08:23
【问题描述】:

我使用如下代码从 SQLite 数据库加载 DataGrid 上的数据:

conn.Open()
Dim sql = "SELECT * FROM TableDataGrid"
Dim cmdConnection As SQLiteCommand = New SQLiteCommand(sql, conn)

Dim da As New SQLiteDataAdapter
da.SelectCommand = cmdConnection

Dim dt As New DataTable
da.Fill(dt)
MyDataGrid.DataSource = dt

当用户点击一行时,我在几个文本框、组合框上显示数据,完全没有问题。

现在我需要让用户通过单击他想要的列来对 DataGrid 进行排序,当然不是那么简单。

在对“e.RowIndex >= 0”和“System.NullReferenceException”错误进行研究后,我了解到“问题是开箱即用的 BindingList 不支持排序!我知道 - 听起来很愚蠢,但就是这样它是。”发在这里:WinForms: DataGridView - programmatic sorting

所以如果我是对的,我需要实现自己的 SortableBindingList,但我很困惑,因为代码示例是关于 LIST 的,我将数据库记录加载到 TABLE (dt) 上

示例: http://timvw.be/2007/02/22/presenting-the-sortablebindinglistt/

另一个帖子说我可以用这样的一行来解决这个问题:

SortableBindingList<YourListType> sortableBindingList = new SortableBindingList<YourListType>(list)

在这种情况下,使 DataGrid 可排序的通用解决方案是什么?

【问题讨论】:

  • DataTable 创建一个DataView,然后将过滤器应用于DataView。将数据源设置为您的视图...
  • 如果您的DataGrdiView 绑定到DataTable,则它已经是可排序的:如果用户单击列标题,则显示将按该列排序。要以编程方式执行此操作,您应该保留数据表:myDT.DefaultView.Sort = "COLUMN_NAME Asc"
  • 你从哪里得到错误 - 什么事件?在任何情况下,您都不需要任何代码来实现排序 - 它自己完成
  • 没有代码,我们只能猜测。假设与所选项目的数量有关,它可能与所选索引或代码有关。该帖子提到了e.RowIndex,但这在SelectionChanged事件中不可用
  • 抱歉,我不能聊天

标签: vb.net sqlite sorting datagridview


【解决方案1】:

感谢用户的提示,我找到了解决方案

 Private Sub MyDataGrid_SelectionChanged(sender As Object, e As EventArgs) Handles MyDataGrid.SelectionChanged

    'Check if the user clicked on a header or a row

    Try
        If MyDataGrid.CurrentRow.Index = Nothing Then
            'Header clicked!! 
        Else
            'Row clicked!!!
            'Here I load the data of the clicked row on my form
            FormCleanDataEntry()
            FormShowRowData()
        End If
    Catch ex As Exception
        'MsgBox(ex.ToString())
    End Try

End Sub

好奇是抛出了异常,但无论如何我没有向用户显示任何消息,并且 DataGrid 已排序并且程序运行正常

【讨论】:

  • a) 吞下异常是个坏主意; b) 您几乎总是想使用IsNothing 进行比较;如果它不会编译你做错了事。那个比较测试没有做你想的那样。我不知道该代码的作用,但从SelectionChanged 触发似乎是个坏主意,因为它被触发得太频繁了。例如,当数据被排序时,选定的行被重置。我应该认为你可以积极辨别用户意图的东西会更好 - 比如当他们双击行标题时。
  • (您也可以将上下文菜单分配给 DGV 甚至按列)
  • @Plutonix 我会尝试双击的想法,但是我需要避免单击标题。
  • 我不知道为什么会这样,但这只是一个建议,您还可以将按钮列或上下文菜单或表单按钮添加到“Foo Selected Row(s)”(同样我不知道代码应该做什么)
  • 如果 DGV 使用 DataTable 作为 DataSource 记录可以在此处编辑 - DGV 将帮助强制执行数据验证元素,例如定义为 Varchar(15) 的列的字符串长度或仅允许有效日期.这意味着没有代码可以将数据从 DGV 移动到控件,然后在它们完成后返回。如果您保存 DataAdapter,则除了 myDA.Update(myDT) 之外,没有其他代码可以更新数据库
猜你喜欢
  • 1970-01-01
  • 2010-11-15
  • 2012-11-04
  • 1970-01-01
  • 2012-08-12
  • 2012-08-12
  • 2014-01-12
  • 1970-01-01
  • 2014-11-23
相关资源
最近更新 更多