持有收藏价值

时间:2010-05-18 06:09:34

标签: vb.net generics

我有一个时间表上的应用程序。我总共有54列,其中10列是可见的,看不见。

前3列是Project,MileStone和Classes。其余的是每天的周六工作时间,TaskId,TaskDesc等等。在我的网格上只有前三列和太阳 - 周六工作小时可见,休息是看不见的。

Sun-Sat的这些列在数据库中不存在。它们根据日期识别并显示在网格上。它们作为数据库中的行存在,但在网格上显示为列。

现在我有名为SunTaskID,MonTaskID等的列,直到SatTaskID用于保存每天taskid [TaskID是从中提取数据的表的PK。每个人都有自己的任务ID。]现在选择SunHrs(星期天的工作小时),我检索那天的taskid,并根据任务ID,然后检索列表框下显示的附件。

现在的问题是,由于一天可以有多个附件,用户可以随时附加多个附件。我无法持有附件。

例如

Project | Milestone | Class | Sunhrs | Monhrs | TueHrs | WedHrs | ThuHrs | FriHrs | satHrs 

abc - xyz |sa       | nyz   | 11.00  | 6.00      | 0     | 0       |1      |1       | 0

abc - xyz |sa       | dasdds| 1.00  | 9.00      | 16   | 10 _      |11      |11       | 10

Attachments
---------------------
|
| abc.txt
| def.pdf
|
|
|____________________

上面说的是我的网格和网格下面,是附件,它是一个用于存放附件的列表框。 _是我当前的光标位置,位于WedHrs,其值为10 [第二行]。

我在VB.Net中使用BindingList(of TaskClass)来绑定网格。我的任务类共有54个属性。我只有10列可见,不可见,其值以编程方式检索。

当前单元格附件为abc.txt和def.pdf。问题是我需要在保存之前将附件附加到多个单元格。但我无法坚持。我的任务模型具有网格的所有属性。然后我在save上迭代集合并检索每个所需项的值。

但对于附件,我需要在taskmodel类中使用某种集合属性来保存连续所有日子的附件。

之前我曾尝试过词典。但我并没有意识到它作为一种财产的使用,所以我给了。然后为附件准备了一个单独的类,但很难将现有附件与taskid同步...

我希望现在问题很清楚

2 个答案:

答案 0 :(得分:0)

我不确定我理解你的问题,但至少有一部分似乎要求一个集合来存储附件。我建议只有一个字典,其中taskID作为键,列表为值,因此您可以将多个附件链接到一个taskID。

Dim attachments As Dictionary(Of Int32, List(Of Object))

答案 1 :(得分:0)

我希望我现在几乎了解你想要实现的目标。 您是否有兴趣了解任何一天的任务(附件)? 此外,用户是否可以在特殊日期添加/删除附件任务独立/任务全面?如果情况并非如此,那么第一个问题的回答是肯定的(否则它会让你回到正轨): 从数据库加载任务并初始化TaskClass对象时,可以将此对象添加到TaskClass中的共享字典中,其中键是日期,值是任务列表。

一个例子:

   Private Sub loadForm(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Task.loadData("only for test case")

        Dim testDate As Date = New Date(2010, 5, 19) 'today, wednesday as in your example
        'now i want all tasks and attachments for this day
        If Task.allDayTasks.ContainsKey(testDate) Then
            Dim allTasksForThisDay As List(Of Task) = Task.allDayTasks(testDate)
            Dim allAttachmentsForThisDay As New List(Of Task.TaskAttachment)
            For Each task As Task In allTasksForThisDay
                For Each attachment As Task.TaskAttachment In task.allAttachments
                    allAttachmentsForThisDay.Add(attachment)
                Next
            Next

            For Each attachment As Task.TaskAttachment In allAttachmentsForThisDay
                Console.WriteLine(attachment.file)
            Next
        End If
    End Sub

    Class Task
        Public Shared allDayTasks As New Dictionary(Of Date, List(Of Task))
        Public taskID As String
        Public allAttachments As New List(Of TaskAttachment)
        Public begin As Date
        Public duration As Int32 'f.e. hours

        Shared Function loadData(ByVal taskID As String) As Task
            'Do your database stuff to get the Task and its attachments
            Dim newTask As New Task
            newTask.taskID = taskID
            newTask.begin = New Date(2010, 5, 19)
            newTask.duration = 10
            '...........
            newTask.allAttachments.Add(New TaskAttachment("abc.txt"))
            newTask.allAttachments.Add(New TaskAttachment("def.pdf"))

            If allDayTasks.ContainsKey(newTask.begin) Then
                'Equals overridden to use contains and indexof
                If allDayTasks(newTask.begin).Contains(newTask) Then
                    Dim taskIndex As Int32 = allDayTasks(newTask.begin).IndexOf(newTask)
                    allDayTasks(newTask.begin)(taskIndex) = newTask
                Else
                    allDayTasks(newTask.begin).Add(newTask)
                End If
            Else
                Dim dayTasks As New List(Of Task)
                dayTasks.Add(newTask)
                allDayTasks.Add(newTask.begin, dayTasks)
            End If

            Return newTask
        End Function

        Public Overrides Function Equals(ByVal obj As Object) As Boolean
            If obj Is Nothing Then
                Return False
            Else
                Return Me.ToString.Equals(obj.ToString)
            End If
        End Function

        Public Overrides Function ToString() As String
            Return Me.taskID.ToString()
        End Function

        Class TaskAttachment
            Sub New(ByVal file As String)
                Me.file = file
            End Sub
            Public file As String
        End Class
    End Class