|
web
newsgroups
|
|||||||||||||||||||||||
|
|||||||||||||||||||||||
For Each Loop Not WorkingI have created a few classes and some of them are collections. When I try to iterate through a collection I receive the following error on the For each line: Expression is of type 'mnaSecurityControl.mnasecurityGroups', which is not a collection type. Here is some more code for better troubleshooting. Windows Form used to access the object: Dim oUser As mnasecurityUser Dim oDBAdapter As New mnasecurityDBAdapter Dim group As mnasecurityGroup Dim x As Integer Dim var As String oUser = oDBAdapter.GetUser("mamarsha") 'GetGroups is a function that is returned as mnasecurityGroups oUser.Groups = oDBAdapter.GetGroups(oUser) 'This loop does not work and the error is on oUser.Groups For Each group In oUser.Groups var = var & "(" & group.Name & ")" Next 'This loop Works For x = 1 To oUser.Groups.Count group = oUser.Groups.Item(x) var = var & "(" & group.Name & ")" Me.TextBox1.Text = var Next Here is the mnasecurityGroups collection class. I think this is where my problem resides. Public Class mnasecurityGroups Private mCol As New Collection 'ADD Method Public Sub Add(ByVal oGroup As mnasecurityGroup, Optional ByVal sKey As String = Nothing) mCol.Add(oGroup, sKey) End Sub 'REMOVE Method Public Sub Remove(ByVal index As Integer) mCol.Remove(index) End Sub 'REMOVE Method Public Sub Remove(ByVal sKey As String) mCol.Remove(sKey) End Sub 'ITEM Property Public ReadOnly Property Item(ByVal index As Integer) As mnasecurityGroup Get Return CType(mCol.Item(index), mnasecurityGroup) End Get End Property 'ITEM Property Public ReadOnly Property Item(ByVal sKey As String, Optional ByVal bHandleNotExists As Boolean = False) As mnasecurityGroup Get If bHandleNotExists Then Try Return CType(mCol.Item(sKey), mnasecurityGroup) Catch ex As Exception Return Nothing End Try Else Return CType(mCol.Item(sKey), mnasecurityGroup) End If End Get End Property 'COUNT Method Public ReadOnly Property Count() As Integer Get Return mCol.Count End Get End Property End Class Here is the get groups method: 'METHOD - Get User Groups - Accepts User as object Public Function GetGroups(ByRef oUser As mnasecurityUser) As mnasecurityGroups Dim oUserGroups As mnasecurityGroups = Nothing 'User Groups Collection Dim oGroup As mnasecurityGroup = Nothing 'All Groups Collection 'Database Variables Dim oConn As SqlConnection Dim oCommand As SqlCommand Dim oDataReader As SqlDataReader Dim sSQL As String 'Open Database oConn = New SqlConnection(sConnStr) oConn.Open() 'SQL String sSQL = "Select a.group_name, a.group_desc, b.group_id " & _ " From groups a inner join user_groups b" & _ " On a.group_id = b.group_id" & _ " Where user_id = '" & oUser.ID & "'" 'Create Command object oCommand = New SqlCommand(sSQL, oConn) oCommand.CommandType = CommandType.Text 'Run query and return to reader object (similar to ADO 2.x RecordSet object) oDataReader = oCommand.ExecuteReader() 'Iterate through Reader object While oDataReader.Read() 'Check if the group exists withing the Groups collection If AllGroups Is Nothing Then AllGroups = New mnasecurityGroups Else oGroup = AllGroups.Item(oDataReader("group_id"), True) End If If oGroup Is Nothing Then oGroup = New mnasecurityGroup 'Set Group object properties oGroup.ID = oDataReader("group_id") oGroup.Name = oDataReader("group_name").ToString.Trim() oGroup.Desc = oDataReader("group_desc").ToString.Trim() 'Add the group to the Groups collection AllGroups.Add(oGroup) End If 'Check if Groups collection has been instantiated If oUserGroups Is Nothing Then oUserGroups = New mnasecurityGroups End If 'Add Group to User Groups collection oUserGroups.Add(oGroup) End While 'Return the Groups object 'GetGroups = oUserGroups Return oUserGroups End Function Let me know if you require further information. Please bear with me because this is my first custom class. Matt,
I thought that I have answered this more to you. The way you go is a long road to go while the answer is so simple. Take a straight datatable or if you want to make what you are busy with now, just create a strongly typed dataset with the wizard and look how it is done. Cor Show quoteHide quote "Matt" <mamarsha@newsgroups.nospam> schreef in bericht news:%23b4G0d7bGHA.4032@TK2MSFTNGP02.phx.gbl... > > > I am in the process of creating a custom .NET object (this is my first > one). I have created a few classes and some of them are collections. When > I try to iterate through a collection I receive the following error on the > For each line: > > > > Expression is of type 'mnaSecurityControl.mnasecurityGroups', which is not > a collection type. > > > > Here is some more code for better troubleshooting. > > > > Windows Form used to access the object: > > > > Dim oUser As mnasecurityUser > > Dim oDBAdapter As New mnasecurityDBAdapter > > Dim group As mnasecurityGroup > > Dim x As Integer > > Dim var As String > > > > oUser = oDBAdapter.GetUser("mamarsha") > > > > 'GetGroups is a function that is returned as mnasecurityGroups > > oUser.Groups = oDBAdapter.GetGroups(oUser) > > > > > > 'This loop does not work and the error is on oUser.Groups > > For Each group In oUser.Groups > > var = var & "(" & group.Name & ")" > > Next > > > > 'This loop Works > > For x = 1 To oUser.Groups.Count > > group = oUser.Groups.Item(x) > > var = var & "(" & group.Name & ")" > > Me.TextBox1.Text = var > > Next > > > > > > Here is the mnasecurityGroups collection class. I think this is where my > problem resides. > > Public Class mnasecurityGroups > > Private mCol As New Collection > > 'ADD Method > > Public Sub Add(ByVal oGroup As mnasecurityGroup, Optional ByVal sKey As > String = Nothing) > > mCol.Add(oGroup, sKey) > > End Sub > > 'REMOVE Method > > Public Sub Remove(ByVal index As Integer) > > mCol.Remove(index) > > End Sub > > 'REMOVE Method > > Public Sub Remove(ByVal sKey As String) > > mCol.Remove(sKey) > > End Sub > > 'ITEM Property > > Public ReadOnly Property Item(ByVal index As Integer) As mnasecurityGroup > > Get > > Return CType(mCol.Item(index), mnasecurityGroup) > > End Get > > End Property > > 'ITEM Property > > Public ReadOnly Property Item(ByVal sKey As String, Optional ByVal > bHandleNotExists As Boolean = False) As mnasecurityGroup > > Get > > If bHandleNotExists Then > > Try > > Return CType(mCol.Item(sKey), mnasecurityGroup) > > Catch ex As Exception > > Return Nothing > > End Try > > Else > > Return CType(mCol.Item(sKey), mnasecurityGroup) > > End If > > End Get > > End Property > > 'COUNT Method > > Public ReadOnly Property Count() As Integer > > Get > > Return mCol.Count > > End Get > > End Property > > End Class > > > > > > > > Here is the get groups method: > > 'METHOD - Get User Groups - Accepts User as object > > Public Function GetGroups(ByRef oUser As mnasecurityUser) As > mnasecurityGroups > > Dim oUserGroups As mnasecurityGroups = Nothing 'User Groups Collection > > Dim oGroup As mnasecurityGroup = Nothing 'All Groups Collection > > 'Database Variables > > Dim oConn As SqlConnection > > Dim oCommand As SqlCommand > > Dim oDataReader As SqlDataReader > > Dim sSQL As String > > 'Open Database > > oConn = New SqlConnection(sConnStr) > > oConn.Open() > > 'SQL String > > sSQL = "Select a.group_name, a.group_desc, b.group_id " & _ > > " From groups a inner join user_groups b" & _ > > " On a.group_id = b.group_id" & _ > > " Where user_id = '" & oUser.ID & "'" > > 'Create Command object > > oCommand = New SqlCommand(sSQL, oConn) > > oCommand.CommandType = CommandType.Text > > 'Run query and return to reader object (similar to ADO 2.x RecordSet > object) > > oDataReader = oCommand.ExecuteReader() > > 'Iterate through Reader object > > While oDataReader.Read() > > 'Check if the group exists withing the Groups collection > > If AllGroups Is Nothing Then > > AllGroups = New mnasecurityGroups > > Else > > oGroup = AllGroups.Item(oDataReader("group_id"), True) > > End If > > If oGroup Is Nothing Then > > oGroup = New mnasecurityGroup > > 'Set Group object properties > > oGroup.ID = oDataReader("group_id") > > oGroup.Name = oDataReader("group_name").ToString.Trim() > > oGroup.Desc = oDataReader("group_desc").ToString.Trim() > > 'Add the group to the Groups collection > > AllGroups.Add(oGroup) > > End If > > 'Check if Groups collection has been instantiated > > If oUserGroups Is Nothing Then > > oUserGroups = New mnasecurityGroups > > End If > > 'Add Group to User Groups collection > > oUserGroups.Add(oGroup) > > End While > > 'Return the Groups object > > 'GetGroups = oUserGroups > > Return oUserGroups > > End Function > > > > Let me know if you require further information. Please bear with me > because this is my first custom class. > > Jupp, that's where the problem is. Your mnasecurityGroups class isn't a
collection, it only contains a collection member. Your class needs to inherit IEnumerable, IList and ICollection to work properly as a collection. Easiest way to do that is by inheriting CollectionBase (if you search for it in the docs you'll find a howto article). Take a look at the classes in the System.Collections.Generic namespace too. Maybe there is some existing collection class that you can use instead of implementing your own. /claes Show quoteHide quote "Matt" <mamarsha@newsgroups.nospam> wrote in message news:%23b4G0d7bGHA.4032@TK2MSFTNGP02.phx.gbl... > Here is the mnasecurityGroups collection class. I think this is where my > problem resides. > > Public Class mnasecurityGroups > > Private mCol As New Collection >
Do nothing but wait loop..
copying records User permission problems. sqlconnection On the fly formatting of textbox contents How can I embedd graphics in Outlook Email without using MAPI Declaration Expected how to prevent the controls in a form and form itself to scroll? Strip chars from a string Reference count? datetime field filled |
|||||||||||||||||||||||