2

我正在编写一个 winforms 应用程序,它将其数据存储为纯文本文件并将其作为多列列表呈现给用户。我希望用户能够对列表进行排序和过滤,还可以重新排序和隐藏/取消隐藏列。

我认为 DataGridView 会很合适,因为它内置了很多功能,但我需要一些单元格类型(例如日期选择器),这些单元格类型在 DataGridView 中是不可用的。我知道您可以在 DGV 中托管控件并阅读过 Technet 文章,但它看起来相当复杂,而且我对 C#、Winforms 和 OOP 很陌生。DGV 也不是最漂亮的控件,即使我知道如何更改它的属性以使它看起来更好一些,但它永远不会到达我真正喜欢它的地方。如果它是要走的路,外观不会破坏交易,但它是一个“不错的选择”。

所以我的问题是:我是否应该努力让 DGV 做我想做的事,即使这需要我更长的时间并且更令人沮丧,还是应该滚动我自己的自定义控件?我在过去创建了几个用户控件并且对此相当满意。

4

6 回答 6

1

布赖恩在上面的评论中是对的。如果您想要自定义,WPF 是您的最佳选择。但是,来自 WinForms 背景并开始使用 WPF 将是一个陡峭的学习曲线。

从头开始编写你自己DataGridView的控件我不认为是一个可行的选择。反映一下代码,你就会明白为什么,这个组件有数千行代码。如果您的意思是您将覆盖该类,那么很酷,这是一个好主意。如果它是基于单元格的控件,例如您想要的数据选择器,您可能会更好地覆盖/子类化...DataGridViewDataGridViewDataGridViewCell

您可以自定义 的外观,DataGridView使其开箱即用,但不要低估从子类/继承DataGridViewCell到制作类似 a所需的时间DataPicker,它不会是那令人愉快,但当然可能......

您可以通过将网格绑定到DataSource类似 aDataTable并对其进行过滤来获得所需的过滤。这将自动过滤显示的结果。

我会考虑为此使用现有的库,因为您将在很大程度上重新发明轮子。当然,大多数控件都是商业的而不是免费的。但肯定有一些...

我希望这有帮助。

于 2013-10-28T16:49:02.187 回答
0

就个人而言,我会坚持使用 WinForms 中的 DataGridView。我不会创建日期选择器单元格类型,而是考虑只启动一个带有日期选择器的新表单来处理单元格中的实际时间/日期条目。这将为您提供所需的定制灵活性,同时不会增加 DGV 的复杂性。DGV 可以大部分或完全保持原样,仅具有开箱即用的功能,然后您可以围绕它构建您的自定义功能,例如使用您自己的自定义表单上的日期选择器建议。

祝你好运。

于 2013-10-28T19:24:53.397 回答
0

一个很好的选择DataGridViewSourceGrid

https://sourcegrid.codeplex.com/

于 2013-10-28T17:08:19.203 回答
0

我已经使用 Infragistics 几年了。他们的 WinForms 产品非常好,尤其是他们的 win 网格控件听起来可以满足您的需求。如果您不想使用他们的网格,您甚至可以在 DataGridView 中使用他们的网格列(他们的网格需要一点时间来适应)。他们的控件有点贵,但如果它适合您的需要,它就在那里。

于 2013-10-28T17:01:56.237 回答
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 日历控件并添加本地业务逻辑。如果返回有效日期,则将其填充到单元格中。如果网格已绑定,则需要更新数据源。

无论如何 - 只是另一种可能的选择。

于 2013-10-28T17:23:57.827 回答
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>
于 2016-11-09T20:50:44.943 回答