数据网格视图或其他东西
本文关键字:其他 视图 数据网 网格 数据 | 更新日期: 2023-09-27 18:37:05
我正在编写一个winforms应用程序,该应用程序将其数据存储为纯文本文件,并将其作为多列列表呈现给用户。 我希望用户能够对列表进行排序和过滤,还可以重新排序和隐藏/取消隐藏列。
我认为 DataGridView 会很合适,因为它内置了很多功能,但我将需要一些单元格类型(例如日期选择器),这些单元格类型在 DataGridView 中无法开箱即用。 我知道您可以在 DGV 中托管控件,并阅读了有关它的 Technet 文章,但它似乎相当复杂,我对 C#、Winforms 和 OOP 很陌生。 DGV也不是最漂亮的控件,即使我知道如何更改其属性以使其看起来更好,它也永远不会到达我真正喜欢它的地方。 如果外观是要走的路,它不是一个交易破坏者,但它是一个"不错的ot have"。
所以我的问题是:我应该努力让 DGV 做我想做的事,即使它需要更长的时间并且更令人沮丧,还是我应该滚动自己的自定义控件? 我过去创建过几个用户控件,并且对此相当满意。
Brian在上面的评论中是对的。如果需要自定义,WPF 是要走的路。但是,来自 WinForms 背景并重新开始使用 WPF 将是一个陡峭的学习曲线。
从头开始编写自己的类似DataGridView
控件,我认为这不是一个可行的选择。反映DataGridView
的代码,您将了解为什么,此组件有数千行代码。如果你的意思是你将覆盖DataGridView
类,那么,很酷,这是一个好主意。如果它是基于单元格的控件,例如您想要的数据选取器,则最好覆盖/子类化DataGridViewCell
......
您可以自定义DataGridView
的外观,使其开箱即用,但不要低估从DataGridViewCell
子类/继承以制作类似DataPicker
的东西所需的时间,它不会那么令人愉快,但当然有可能......
您可以获得所需的过滤,只需将网格绑定到DataSource
(如DataTable
)并对其进行过滤即可。这将自动过滤显示的结果。
我会考虑为此使用现有的库,因为您将在很大程度上重新发明轮子。当然,大多数控件都是商业的,不是免费的;但一定有一些是...
我希望这有所帮助。
我已经使用Infragistics几年了。 他们的WinForms产品非常好,特别是他们的Win网格控制听起来可以满足您的需求。 如果您不想使用他们的网格,您甚至可以在 DataGridView 中使用他们的网格列(他们的网格需要一点时间来适应)。 他们的控件有些昂贵,但如果它适合您的需求,它就在那里。
DataGridView
的一个很好的选择是SourceGrid
:
https://sourcegrid.codeplex.com/
我尝试了使用用于我们系统的日历表单进行测试:
Private Sub dgvTaskLog_CellContentClick(sender As System.Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvTaskLog.CellContentClick
Dim frm As New frmCalendar
frm.ShowDialog()
If IsDate(frm.outSelectedDate) Then
dgvTaskLog(e.ColumnIndex, e.RowIndex).Value = frm.outSelectedDate
End If
End Sub
当用户单击单元格时,将打开自定义日历窗体。您最需要检查一下只显示该列的日历(或其他"控件")的列。不确定这如何用于在单元格周围跳动,您可能需要另一个事件来将其拉下来。
自定义窗体承载 VB.Net 日历控件并添加本地业务逻辑。如果返回有效日期,则会将其填充到单元格中。如果网格已绑定,则需要改为更新数据源。
无论如何 - 只是另一种可能的选择。
就个人而言,我会坚持使用WinForms中的DataGridView。 与其创建日期选择器单元格类型,不如考虑启动一个带有日期选择器的新表单,以处理单元格中的实际时间/日期输入。 这将为您提供所需的定制灵活性,同时不会增加 DGV 的复杂性。 DGV 可以大部分或完全保持原样,仅具有开箱即用的功能,然后您可以按照日期选择器的建议在您自己的自定义窗体上围绕它构建自定义功能。
祝你好运。
扩展 DataGridView 的功能并不容易,但可以像我在报表管理器之前所做的那样完成。 您还可以创建自定义字段控件。 也许最简单的方法是使用 gridview 创建一个模板字段并使用 ajax 日历扩展器。
<asp:GridView ID="myGridView" runat="server">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:TextBox ID="myTextBox" runat="server" />
<ajaxToolkit:CalendarExtender ID="calDate" runat="server" TargetControlID="myTextBox" Format="MM/dd/yyyy" SelectedDate='01/01/2016'></ajaxToolkit:CalendarExtender>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>