[英]Datagridview or something else?
我正在編寫一個winforms應用程序,該應用程序將其數據存儲為純文本文件,並將其作為多列列表呈現給用戶。 我希望用戶能夠對列表進行排序和過濾,還可以對列進行重新排序和隱藏/取消隱藏。
我認為DataGridView會很合適,因為它內置了許多功能,但是我將需要一些DataGridView不能立即使用的單元格類型(例如日期選擇器)。 我知道您可以在DGV中托管控件並閱讀了Technet上的文章,但是它看起來相當復雜,並且對C#,Winforms和OOP不熟悉。 DGV也不是最漂亮的控件,即使我知道如何更改其屬性以使其看起來更好,它也從未到達我真正喜歡的地方。 如果可以的話,外觀並不是決定性的事情,但這是一個“不錯的選擇”。
所以我的問題是:我應該為使DGV做我想做的事情而苦苦掙扎,即使我花了更長的時間並且做起來更令人沮喪,還是我應該滾動自己的自定義控件? 過去,我已經創建了幾個用戶控件,對此我相當滿意。
Brian在上面的評論中是對的。 如果要自定義,則可以使用WPF。 但是,來自WinForms的背景並從WPF重新開始將是一個艱難的學習過程。
從頭開始編寫自己的類似DataGridView
的控件,我認為這不是一個可行的選擇。 反映出DataGridView
的代碼,您將明白為什么,此組件有成千上萬行代碼。 如果您的意思是您將覆蓋DataGridView
類,那么很酷,那是個好主意。 如果它是基於單元格的控件(例如您想要的數據選擇器),則最好改寫/子類化DataGridViewCell
而不是...
您可以自定義DataGridView
的外觀以使其看起來開箱即用,但不要低估從DataGridViewCell
繼承/繼承以制作類似DataPicker
類的東西所需的時間。不會那么令人愉快,但當然有可能...
您只需將網格綁定到DataTable
類的DataSource
並將其過濾,即可獲得所需的過濾。 這將自動過濾顯示的結果。
我會考慮為此使用現有的庫,因為您將在很大程度上重新發明輪子。 當然,大多數控件都是商業性的,而不是免費的。 但一定有一些...
我希望這有幫助。
我已經使用Infragistics幾年了。 他們的WinForms產品非常出色,尤其是他們的贏網格控制聽起來很滿足您的需求。 如果您不想使用他們的網格,甚至可以在DataGridView中使用他們的網格列(他們的網格需要一點時間來習慣)。 他們的控件有些昂貴,但是如果您需要它,它就在那兒。
DataGridView
一個很好的替代方法是SourceGrid
:
我嘗試使用用於系統的日歷表單進行測試:
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的功能並不容易,但是可以像在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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.