01. august 2006 - 00:14Der er
28 kommentarer og 1 løsning
Lave sin egen collection
Hej
Jeg vil gerne lave min egen collection. Jeg forestiller mig f.eks. at have et objekt som ser ud som følger:
Public Class obj Private _a As Integer Private _b As String Private _c As Date
Public Sub New(ByVal a As Integer, ByVal b As String, ByVal c As Date) _a = a _b = b _c = c
End Sub
Public Property A() As Integer Get Return _a End Get Set _a = value End Set End Property Public Property B() As String Get Return _b End Get Set _b = value End Set End Property
Public Property C() As Date Get Return _c End Get Set _c = value End Set End Property
Jeg vil så gerne lave en collection af disse, med funktioner der kan add, remove, sort osv, men hvordan gøres det smartes:
Public Class MyData Private m_s As String Public Sub New() Me.New("") End Sub Public Sub New(ByVal s As String) Me.m_s = s End Sub Public Overloads Overrides Function ToString() As String Return m_s End Function Public Property S() As String Get Return m_s End Get Set m_s = value End Set End Property End Class
Class TypSafCol2 Public Shared Sub Main(ByVal args As String()) Dim mycol As List(Of MyData) = New List(Of MyData)() mycol.Add(New MyData("A")) mycol.Add(New MyData("BB")) mycol.Add(New MyData("CCC")) For i As Integer = 0 To mycol.Count - 1 Console.WriteLine(mycol(i)) Next End Sub End Class
Synes godt om
Slettet bruger
01. august 2006 - 09:57#4
Hej
Hvad er forskellen på på nedenstående to måder at definerer sin collection på:
Public Class MyCollection Inherits CollectionBase
Default Public ReadOnly Property Item(index As Integer) As MyData Get Return CType(List(index), MyData) End Get End Property
Public Function Add(value As MyData) As Integer Return List.Add(value) End Function 'Add End Class 'MyCollection ___________________________________________________________
Class TypSafCol2 Public Shared Sub Main(ByVal args As String()) Dim mycol As List(Of MyData) = New List(Of MyData)() mycol.Add(New MyData("A")) mycol.Add(New MyData("BB")) mycol.Add(New MyData("CCC")) For i As Integer = 0 To mycol.Count - 1 Console.WriteLine(mycol(i)) Next End Sub End Class
Er følgende tæt på noget man kan være bekendt? Jeg har følgnede 4 lag: DAL, BLL, PL og COMMON Jeg har en db med lovdokumenter Jeg vil gerne præsentere en liste med dokumenterne og det skal være muligt at sortere kollonnerne og vælge ud efter forskellige kriterier.
Public Function GetAllLovDokumenter() As List(Of LovDokument)
Dim DBConn As DataHelperClass = New DataHelperClass Dim Conn As OleDbConnection = DBConn.GetConnection()
Dim SqlCmd As New OleDbCommand("SELECT l.Nummer, l.Ny_lovgivning , l.Gruppe_nummer, l.Gruppe_navn, l.Link, l.Dokumenttype," & _ "l.Forskriftens_nummer, l.Aendring_til, l.Dato, l.Forskriftens_titel, l.Printet, l.Placering, l.Status, l.Populaertitel FROM Lovsamling As l", Conn) Dim Reader As OleDbDataReader = SqlCmd.ExecuteReader 'Dim LovDokumentCol As LovDokumentCollection = New LovDokumentCollection Dim LovDokumentList As List(Of LovDokument) = New List(Of LovDokument)()
While Reader.Read Dim objLovDokumnet As LovDokument = New LovDokument
objLovDokumnet.Id = Reader("Nummer") If Not Reader("Ny_lovgivning") Is DBNull.Value Then objLovDokumnet.NyLovgivning = Reader("Ny_lovgivning") Else objLovDokumnet.NyLovgivning = "" End If objLovDokumnet.Gruppenr = Reader("Gruppe_nummer") If Not Reader("Gruppe_navn") Is DBNull.Value Then objLovDokumnet.Gruppenavn = Reader("Gruppe_navn") Else objLovDokumnet.Gruppenavn = "" End If If Not Reader("Link") Is DBNull.Value Then objLovDokumnet.Link = Reader("Link") Else objLovDokumnet.Link = "" End If objLovDokumnet.Dokumenttype = Reader("Dokumenttype") objLovDokumnet.Forskriftens_nummer = Reader("Forskriftens_nummer") If Not Reader("Aendring_til") Is DBNull.Value Then objLovDokumnet.Aendring_til = Reader("Aendring_til") Else objLovDokumnet.Aendring_til = "" End If If Not Reader("Dato") Is DBNull.Value Then objLovDokumnet.Dato = Reader("Dato") Else objLovDokumnet.Dato = Nothing End If If Not Reader("Forskriftens_titel") Is DBNull.Value Then objLovDokumnet.Forskriftens_titel = Reader("Forskriftens_titel") Else objLovDokumnet.Forskriftens_titel = "" End If objLovDokumnet.Printet = Reader("Printet") If Not Reader("Placering") Is DBNull.Value Then objLovDokumnet.Placering = Reader("Placering") Else objLovDokumnet.Placering = "" End If objLovDokumnet.Status = Reader("Status") If Not Reader("Populaertitel") Is DBNull.Value Then objLovDokumnet.Populaertitel = Reader("Populaertitel") Else objLovDokumnet.Populaertitel = "" End If LovDokumentList.Add(objLovDokumnet) End While
Return LovDokumentList
End Function 'GetLovDokumenter
End Class 'LovDokumetDB -----------------------------------------------------------------------------
Dim objAllLov As DAL.Lovgivning.ILovdokument = New DAL.Lovgivning.LovDokumetDB Dim objLovList As List(Of LovDokument) = objAllLov.GetAllLovDokumenter Return objLovList End Function 'GetAllLovgivning
Partial Class Modules_Lovsamling_lovsamling_index Inherits System.Web.UI.Page
Sub Page_Load() If Not IsPostBack Then
'Henter alle uafsluttede afvigelser og binder til datagrid Dim objBLL As LovsamlingManager = New LovsamlingManager Dim LovDokumentList As List(Of LovDokument) = objBLL.GetAllLovgivning
'Binder til datagrid Lovsamling.DataSource = LovDokumentList Lovsamling.DataBind()
Public Class LovDokument Private _Id As Integer Private _NyLovgivning As Date Private _Gruppenr As Integer Private _Gruppenavn As String Private _Link As String Private _Dokumenttype As String Private _Forskriftens_nummer As Integer Private _Aendring_til As String Private _Dato As Date Private _Forskriftens_titel As String Private _Printet As Boolean Private _Placering As String Private _Status As Boolean Private _Populaertitel As String Private _AfdelingsID As Integer Private _Afdelingsref As Integer Private _AfdelingsNr As String Private _AfdelingsNavn As String
Public Sub New()
End Sub
Public Sub New( _ ByVal Id As Integer, _ ByVal NyLovgivning As Date, _ ByVal Gruppenr As String, _ ByVal Gruppenavn As String, _ ByVal Link As String, _ ByVal Dokumenttype As String, _ ByVal Forskriftens_nummer As Integer, _ ByVal Aendring_til As String, _ ByVal Dato As Date, _ ByVal Forskriftens_titel As String, _ ByVal Printet As Boolean, _ ByVal Placering As String, _ ByVal Status As Boolean, _ ByVal Populaertitel As String, _ ByVal AfdelingsID As Integer, _ ByVal Afdelingsref As Integer, _ ByVal AfdelingsNr As String, _ ByVal AfdelingsNavn As String)
Public Property Id() As Integer Get Return _Id End Get Set(ByVal value As Integer) _Id = value End Set End Property
Public Property NyLovgivning() As Date Get Return _NyLovgivning End Get Set(ByVal value As Date) _NyLovgivning = value End Set End Property
Public Property Gruppenr() As Integer Get Return _Gruppenr End Get Set(ByVal value As Integer) _Gruppenr = value End Set End Property
Public Property Gruppenavn() As String Get Return _Gruppenavn End Get Set(ByVal value As String) _Gruppenavn = value End Set End Property
Public Property Link() As String Get Return _Link End Get Set(ByVal value As String) _Link = value End Set End Property
Public Property Dokumenttype() As String Get Return _Dokumenttype End Get Set(ByVal value As String) _Dokumenttype = value End Set End Property
Public Property Forskriftens_nummer() As Integer Get Return _Forskriftens_nummer End Get Set(ByVal value As Integer) _Forskriftens_nummer = value End Set End Property
Public Property Aendring_til() As String Get Return _Aendring_til End Get Set(ByVal value As String) _Aendring_til = value End Set End Property
Public Property Dato() As Date Get Return _Dato End Get Set(ByVal value As Date) _Dato = value End Set End Property
Public Property Forskriftens_titel() As String Get Return _Forskriftens_titel End Get Set(ByVal value As String) _Forskriftens_titel = value End Set End Property
Public Property Printet() As Boolean Get Return _Printet End Get Set(ByVal value As Boolean) _Printet = value End Set End Property
Public Property Placering() As String Get Return _Placering End Get Set(ByVal value As String) _Placering = value End Set End Property
Public Property Status() As Boolean Get Return _Status End Get Set(ByVal value As Boolean) _Status = value End Set End Property
Public Property Populaertitel() As String Get Return _Populaertitel End Get Set(ByVal value As String) _Populaertitel = value End Set End Property
Public Property AfdelingsID() As Integer Get Return _AfdelingsID End Get Set(ByVal value As Integer) _AfdelingsID = value End Set End Property
Public Property Afdelingsref() As Integer Get Return _Afdelingsref End Get Set(ByVal value As Integer) _Afdelingsref = value End Set End Property
Public Property AfdelingsNr() As String Get Return _AfdelingsNr End Get Set(ByVal value As String) _AfdelingsNr = value End Set End Property
Public Property AfdelingsNavn() As String Get Return _AfdelingsNavn End Get Set(ByVal value As String) _AfdelingsNavn = value End Set End Property
Hvor og hvordan skal jeg lave de funktioner der sorterer efter f.eks. Forskriftens_titel ?
I det jeg har prøvet på, spørger jeg fra PL ind i BLL, der jo dykker ned i DAL og DB, hvorefter jeg sorterer og binder til datagrid. Men er det nødvendigt??
PS. sig til hvis spørgsmåle er blevet for stort til 60 points.
jeg kan som nævnt i tidligere spørgsmål godt lide interfaces og en factory
det der BLL er jo ret "tyndt" - hvis aldrig der kommer mere funktionalitet, så behøves det ikke, men hvis der senere kan komme noget funktionalitet så behold det
den indbyggede List klasse har en Sort metode du kan bruge
Synes godt om
Slettet bruger
09. august 2006 - 02:25#14
Hej
Sorry - jeg ved at jeg gentager nogle af mine spørgsmål.
Synes godt om
Slettet bruger
12. august 2006 - 23:46#15
Hej igen
Nu har jeg rodet meget længe med det her, men jeg forstår det altså ikke endnu, så jeg håber du har lidt tålmodighed.
Jeg forstår ikke helt hvordan jeg skal bruge "list(of person)".
Jeg tænker at det er smartes at have "list(of person)" i et "common-layer". Når jeg så skal præsentere data binder jeg til list(of person) i common. Hvis jeg så efterfølgende skal præsentere data anderleds, ligger den komplette "list(of person)" i common-layer og den kan så modificeres på den ene eller anden måde uden atter at tilgå databasen for at hente data igen. Jeg kan dog ikke helt for denne tanke til at stemme overens med at du siger at jeg skal droppe PersonCollection klassen. 1. Er det helt skævt at have "list(of person)" i et "common-layer"?
Jeg kan godt fylde min "list(of person)" fra databasen, men jeg kan ikke tilgå den senere uden at bede den om at kigge ned i databasen igen. 2. Hvordan ”gemmer” jeg "list(of person)", så jeg f.eks. kan sortere på data uden at bede den om at kigge ned i databasen igen.
Public Class Person Private _Id As Integer Private _Fornavne As String Private _Efternavn As String Private _Tlf As String Private _Birth As Date
Public Sub New()
End Sub
Public Sub New( _ ByVal Id As Integer, _ ByVal Fornavne As String, _ ByVal Efternavn As String, _ ByVal Tlf As String, _ ByVal Birth As Date) _Id = Id _Fornavne = Fornavne _Efternavn = Efternavn _Tlf = Tlf _Birth = Birth
End Sub
Public Property Id() As Integer Get Return _Id End Get Set(ByVal value As Integer) _Id = value End Set End Property
Public Property Fornavne() As String Get Return _Fornavne End Get Set(ByVal value As String) _Fornavne = value End Set End Property
Public Property Efternavn() As String Get Return _Efternavn End Get Set(ByVal value As String) _Efternavn = value End Set End Property
Public Property Tlf() As String Get Return _Tlf End Get Set(ByVal value As String) _Tlf = value End Set End Property
Public Property Birth() As Date Get Return _Birth End Get Set(ByVal value As Date) _Birth = value End Set End Property
End Class 'Class Person
Public Class PersonList(Of Person) Inherits CollectionBase
Default Public Property Item(ByVal index As Integer) As Person Get Return CType(InnerList(index), Person) End Get
Set(ByVal Value As Person) InnerList(index) = Value End Set
End Property
Public Function Add(ByVal value As Person) As Integer Return InnerList.Add(value) End Function
Public Function IndexOf(ByVal value As Person) As Integer Return InnerList.IndexOf(value) End Function
Public Sub Insert(ByVal index As Integer, ByVal value As Person) InnerList.Insert(index, value) End Sub
Public Sub Remove(ByVal value As Person) InnerList.Remove(value) End Sub
Public Function Contains(ByVal value As Person) As Boolean Return InnerList.Contains(value) End Function
End Class 'Class PersonList
Synes godt om
Slettet bruger
13. august 2006 - 00:09#16
Vent lidt - jeg er vist noget galt på den. Jeg kigger lidt mere på det....
Synes godt om
Slettet bruger
13. august 2006 - 00:23#17
Nej - jeg kan ikke gennemskue det (jf. indlæg kl. 23:46:12).
Namespace E Public Class MyData Private _v As Integer Private _s As String
Public Sub New() MyClass.New(0, "") End Sub
Public Sub New(ByVal v As Integer, ByVal s As String) _v = v _s = s End Sub
Public Property V() As Integer Get Return _v End Get Set _v = value End Set End Property
Public Property S() As String Get Return _s End Get Set _s = value End Set End Property
Public Overloads Overrides Function ToString() As String Return ("(" & _v & "," & _s & ")") End Function End Class
Public Class MyDataComparerV Implements IComparer Function Compare(ByVal o1 As Object, ByVal o2 As Object) As Integer Implements IComparer.Compare Return (CType(o1, MyData).V - CType(o2, MyData).V) End Function End Class
Public Class MyDataComparerS Implements IComparer Function Compare(ByVal o1 As Object, ByVal o2 As Object) As Integer Implements IComparer.Compare Return CType(o1, MyData).S.CompareTo(CType(o2, MyData).S) End Function End Class
Public Class MainClass Public Shared Sub Main(ByVal args As String()) Dim al As ArrayList = New ArrayList al.Add(New MyData(2, "A")) al.Add(New MyData(1, "CCC")) al.Add(New MyData(3, "BB")) Dim i As Integer For i = 0 To al.Count-1 Console.WriteLine(al(i)) Next al.Sort(New MyDataComparerV) For i = 0 To al.Count-1 Console.WriteLine(al(i)) Next al.Sort(New MyDataComparerS) For i = 0 To al.Count-1 Console.WriteLine(al(i)) Next End Sub End Class End Namespace
så den type sikre som man lavede den i .NET 1.x ved at lave en egen klasse som extender ColelctionBase:
Imports System Imports System.Collections
Namespace E Public Class MyData Private _v As Integer Private _s As String
Public Sub New() MyClass.New(0, "") End Sub
Public Sub New(ByVal v As Integer, ByVal s As String) _v = v _s = s End Sub
Public Property V() As Integer Get Return _v End Get Set _v = value End Set End Property
Public Property S() As String Get Return _s End Get Set _s = value End Set End Property
Public Overloads Overrides Function ToString() As String Return ("(" & _v & "," & _s & ")") End Function End Class
Public Class MyDataCollection Inherits CollectionBase Default Public ReadOnly Property Blubber(ByVal index As Integer) As MyData Get Return CType(List(index), MyData) End Get End Property
Public Function Add(ByVal value As MyData) As Integer Return List.Add(value) End Function
Public Sub Sort(ByVal cmp As IComparer) Me.InnerList.Sort(cmp) End Sub End Class
Public Class MyDataComparerV Implements IComparer Function Compare(ByVal o1 As Object, ByVal o2 As Object) As Integer Implements IComparer.Compare Return (CType(o1, MyData).V - CType(o2, MyData).V) End Function End Class
Public Class MyDataComparerS Implements IComparer Function Compare(ByVal o1 As Object, ByVal o2 As Object) As Integer Implements IComparer.Compare Return CType(o1, MyData).S.CompareTo(CType(o2, MyData).S) End Function End Class
Public Class MainClass Public Shared Sub Main(ByVal args As String()) Dim mdc As MyDataCollection = New MyDataCollection mdc.Add(New MyData(2, "A")) mdc.Add(New MyData(1, "CCC")) mdc.Add(New MyData(3, "BB")) Dim i As Integer For i = 0 To mdc.Count-1 Console.WriteLine(mdc(i)) Next mdc.Sort(New MyDataComparerV) For i = 0 To mdc.Count-1 Console.WriteLine(mdc(i)) Next mdc.Sort(New MyDataComparerS) For i = 0 To mdc.Count-1 Console.WriteLine(mdc(i)) Next End Sub End Class End Namespace
Namespace E Public Class MyData Private _v As Integer Private _s As String Public Sub New() Me.New(0, "") End Sub Public Sub New(ByVal v As Integer, ByVal s As String) _v = v _s = s End Sub Public Property V() As Integer Get Return _v End Get Set _v = value End Set End Property Public Property S() As String Get Return _s End Get Set _s = value End Set End Property Public Overloads Overrides Function ToString() As String Return ("(" & _v & "," & _s & ")") End Function End Class Public Class MainClass Private Shared Function MyDataComparerV(ByVal o1 As MyData, ByVal o2 As MyData) As Integer Return (o1.V - o2.V) End Function Private Shared Function MyDataComparerS(ByVal o1 As MyData, ByVal o2 As MyData) As Integer Return o1.S.CompareTo(o2.S) End Function Public Shared Sub Main(ByVal args As String()) Dim mdc As List(Of MyData) = New List(Of MyData)() mdc.Add(New MyData(2, "A")) mdc.Add(New MyData(1, "CCC")) mdc.Add(New MyData(3, "BB")) For i As Integer = 0 To mdc.Count-1 Console.WriteLine(mdc(i)) Next mdc.Sort(AddressOf MyDataComparerV) For i As Integer = 0 To mdc.Count-1 Console.WriteLine(mdc(i)) Next mdc.Sort(AddressOf MyDataComparerS) For i As Integer = 0 To mdc.Count-1 Console.WriteLine(mdc(i)) Next End Sub End Class End Namespace
Synes godt om
Slettet bruger
13. august 2006 - 15:53#21
Meget fornemt - mange tak.
Synes godt om
Slettet bruger
13. august 2006 - 19:58#22
Nu har jeg fået det til at præsenterer listen, men jeg kan ikke få det til at virke uden at der dykkes ned i databasen hver gang. Er det ikke muligt at undgå og er det ikke smartes?
Mit common layer:
Public Class LovdokumentList Private Shared Function _ComparerID(ByVal o1 As LovDokument, ByVal o2 As LovDokument) As Integer Return (o1.Id - o2.Id) End Function
Private Shared Function _ComparerDokumentType(ByVal o1 As LovDokument, ByVal o2 As LovDokument) As Integer Return o1.Dokumenttype.CompareTo(o2.Dokumenttype) End Function
Public Shared Function Main() Dim MyLovdokumentList As List(Of LovDokument) = New List(Of LovDokument)() Dim objBLL As BLL.LovsamlingBLL.LovsamlingManagerBLL
If objBLL Is Nothing Then objBLL = New BLL.LovsamlingBLL.LovsamlingBLL MyLovdokumentList.AddRange(objBLL.GetAllLovdokument(2, "DokumentType")) Else MyLovdokumentList.AddRange(objBLL) End If Return MyLovdokumentList End Function
Public Function ComparerID() Dim MyLovdokumentList As List(Of LovDokument) = New List(Of LovDokument)() Dim objBLL As BLL.LovsamlingBLL.LovsamlingManagerBLL
If objBLL Is Nothing Then objBLL = New BLL.LovsamlingBLL.LovsamlingBLL MyLovdokumentList.AddRange(objBLL.GetAllLovdokument(2, "DokumentType")) Else MyLovdokumentList.AddRange(objBLL) End If MyLovdokumentList.Sort(AddressOf _ComparerID) Return MyLovdokumentList End Function
End Class
Codebehind der binder listen til et grid:
'Binder til datagrid Lovsamling.DataSource = LovdokumentList.Main() Lovsamling.DataBind()
Codebehind der skal sortere - men det skulle helst ske uden at der igen dykkes ned i db, skal det ikke?
jo forudsat at det er de samme data som skal vises og at databasen ikke er blevet opdateret af en anden i mellem tiden
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.