我正在编写一个winforms应用程序,它将其数据存储为纯文本文件,并将其作为多列列表呈现给用户。我希望用户能够对列表进行排序和过滤,还可以重新排序和隐藏/取消隐藏列。
我认为DataGridView很适合,因为它内置了很多功能,但是我需要一些单元格类型(例如日期选择器),这些类型不是开箱即用的DataGridView的。我知道你可以在DGV中托管控件并阅读了一篇关于它的Technet文章,但它看起来相当复杂,我对C#,Winforms和OOP很新。 DGV也不是最漂亮的控件,尽管我知道如何改变它的属性以使它看起来更好,它永远不会到达我真正喜欢的地方。外表不是一个破坏者,如果它是要走的路,但它是一个“不错的。”
所以我的问题是:我是否应该努力让DGV做我想做的事情,即使它花了我更长的时间并且更令人沮丧,或者我应该自己动手制作自己的自定义控件?我过去创建了几个用户控件,对此非常熟悉。
答案 0 :(得分:1)
Brian在上面的评论中是正确的。如果你想要自定义,WPF就是你要走的路。然而,来自WinForms背景并开始使用WPF将是一个陡峭的学习曲线。
编写自己的DataGridView
- 就像 scratch 中的控件一样,我认为这不是一个可行的选择。反映DataGridView
的代码,你会明白为什么,这个组件有数千行代码。如果你的意思是你将覆盖DataGridView
类,那么,很酷,这是一个好主意。如果它是基于单元格的控件,比如你想要的数据选择器,你可以更好地覆盖/子类化DataGridViewCell
而不是......
您可以自定义DataGridView
的外观,使其看起来很好看,但不要低估从{{1}继承/继承所花费的时间制作像DataGridViewCell
这样的东西,它不会那么有趣,但当然可能......
您只需将网格绑定到像DataPicker
这样的DataSource
并对其进行过滤即可获得所需的过滤功能。这将自动过滤显示的结果。
我会考虑使用现有的库,因为你将在很大程度上重新发明轮子。当然,大多数控件都是商业的而不是免费的;但必须有一些......
我希望这会有所帮助。
答案 1 :(得分:0)
我已经使用Infragistics几年了。他们的WinForms产品非常好,特别是他们的胜利网格控制听起来像是满足您的需求。如果您不想使用他们的网格,他们甚至可以在DataGridView中使用他们的网格列(他们的网格需要一点时间来习惯)。他们的控制有点贵,但如果它适合你的需要它就在那里。
答案 2 :(得分:0)
DataGridView
的一个不错的选择是SourceGrid
:
答案 3 :(得分:0)
我尝试使用我用于系统的日历表单进行测试:
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日历控件并添加本地业务逻辑。如果返回有效日期,则将其填入单元格。如果绑定了网格,则需要更新数据源。
任何方式 - 只是另一种可能的选择。
答案 4 :(得分:0)
就个人而言,我会坚持使用WinForms中的DataGridView。我不会考虑制作日期选择器单元格类型,而是考虑启动一个带有日期选择器的新表单来处理进入单元格的实际时间/日期。这将为您提供所需的定制灵活性,同时不会增加DGV的复杂性。 DGV可以大部分或完全保留原样,只需开箱即用的功能,然后您可以根据自己的自定义表单上的日期选择器建议围绕它创建自定义功能。
祝你好运。答案 5 :(得分:0)
扩展DataGridView的功能并不容易,但可以在我Report Manager之前完成。您还可以创建自定义字段控件。也许最简单的方法是使用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>