|
tell your IDE to always display line numbers (Visual Studio Tricks[^]).
go to the offending line.
take the message literally: some argument is null where it should not be.
now fix it.
if you still don't see it, use a debug run, and watch the values in the offending line.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
I have no problem picking up the line number and col number from the bottom of the IDE. It very clearly shows it.
What I am not understanding is WHY the code is not returning the controlType? This loop (line numbers added for your convienance) from lines 43 to 56 should pick up the type as being a Label from what was defined and pased into it. I would imagine that is what appears to be Null - it doesn't pick up that lblRods_ is a label even though I have tried both of these combinations:
Dim Labels As Label() = ControlArrayUtils.getControlArray(Me, "lblRods")
Dim lblRods As Label() = ControlArrayUtils.getControlArray(Me, "lblRods")
and I don't know how many other combinations. My conclusion is an error in the original code- but that is because I am not certain. I would hope somebody with more experience than myself would be able to examine and determine if that is the case and possible suggest a solution. I'm assuming it would return the controlType as Label and not Null
43 If maxIndex > -1 Then
44
45 For i = 0 To maxIndex
46 Dim aControl As Control = _
47 getControlFromName(frm, controlName, i, separator)
48 If Not (aControl Is Nothing) Then
49 'Save the object Type (uses the last
50 'control found as the Type)
51 controlType = aControl.GetType
52 End If
53 alist.Add(aControl)
54 Next
55 End If
56 Return alist.ToArray(controlType)
|
|
|
|
|
From the MSDN documentation on ArrayList.ToArray(Type) it is clear an ArgumentNullException will be thrown when the type is Nothing. So here are two ways to get that, assuming controlType starts at Nothing:
1. the if fails in line 43
2. getControlFromName in line 47 return Nothing for any of a million reasons (maybe controlName does not contain what you hope for)
I must say your code snippet (lines 43-56) is a bit bizarre; either you expect to find a single control, then why would you need an ArrayList? or you expect multiple controls, but then the last one decides on the type of all of them?? This could work fine under your current conditions, I can't tell, it doesn't look very robust. And, as stated before, there may be zero matches, resulting in line 56 causing an Exception.
FWIW: I advise you start each VB file with "Option Strict On". It will cause some pain as now the system complains a lot, but it will force you to improve your code and in the end save lots of debugging time.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
I have to agree...that is some bizarre code.
So, you have 13 labels that all start with lblRods. So then, you're running the function to return an array of controls that all start with lblRods. All of that is great.
Your problem is with the getControlArray code. Think about what it should do and then look at exactly what it does.
It should loop through all of the controls on the form and see if the control starts with the value you passed in, in this case "lblRods". If it does start with that, then you want to add it to the array.
Here's what your code does. You search through the controls and are looking for the highest index of the controls. So, your code matches each control that starts with lblRods and instead of adding that control to an array, you instead, see if it's index is the highest index so far.
Then, if the index is greater than -1, you go through and call GetControlFromName which will return a control with the exact name that you passed it. In this case, you passed it lblRods. It will never return a control with that exact name because it doesn't exist.
So, what happens is that aList will have nothing in it and controlType will equal Nothing .
Why didn't you just add the controls to the list when you found them in the first for each loop? That's all you needed to do. And you need to make sure that the array isn't empty before returning something. How about a re-write:
Public Shared Function getControlArray(ByVal frm As System.Windows.Forms.Form, _
ByVal controlName As String, _
ByVal TypeToReturn As Type, _
Optional ByVal separator As String = "") As Control()
Dim aList As New ArrayList
For Each ctrl As Control In frm.Controls
If ctrl.Name.ToLower.StartsWith(controlName.ToLower & separator) And _
ctrl.GetType = TypeToReturn Then
aList.Add(ctrl)
End If
Next
If aList.Count = 0 Then
Return Nothing
Else
Return aList.ToArray(TypeToReturn)
End If
End Function
it's that easy...you were making it too complicated.
If you're only wanting to return a single type, then you really need to make sure to check that that type is the right type. Obviously, you can know that the only thing with the name "lblRods" is going to be a label because you wrote it that way, but then why not just hard code the values, unless you're trying to make something that can be used in other places.
When you call it then, just do:
Dim labels() as Label = GetControlArray(Me, "lblRods", GetType(Label))
modified on Thursday, May 27, 2010 2:34 PM
|
|
|
|
|
Thanks, the last two replies help me to understand what is going on a little bit better. I'm wanting an easier way to handle this. I have a tab on the form with 4 tabs and on each tab the number of items that will vary from day to day : 13 Rods, 11 Tubes, 10 Equip, and 9 Misc. So hard coding it is not really desirable.
I wonder if it shows Null or nothing as a result of the labels being on the tab. When I ran this:
For Each Row In dstbl.Rows
If rowNdx = recCount Then
Exit For
End If
For Each c As Control In Me.TabPage1.Controls
If c.Name = "lblRods_" & lblNdx Then
c.Tag = dsMaterial.Tables(0).Rows(rowNdx)("MaterialsID").ToString()
c.Text = dsMaterial.Tables(0).Rows(rowNdx)("Material").ToString()
End If
Next
rowNdx = rowNdx + 1 'keep track of where we are at
lblNdx = lblNdx + 1
Next
It did not work as For Each c As Control In Me.Controls Debug.Print showed me the names of each control but I just got tabLOL but not tabLOL.TabPage1 so when I hard coded it fills in properly.
So I changed to having 4 separate functions:
Private Function LoadTab1Data() As Boolean
Private Function LoadTab2Data() As Boolean
Private Function LoadTab3Data() As Boolean
Private Function LoadTab4Data() As Boolean
And it seems to be working when I change the statement:
Dim mySelectQuery As String = "SELECT MaterialsID, Type, Sequence, Material " & _
"FROM Materials " & _
"WHERE Type = 2 " & _
"ORDER BY Type, Sequence;"
and change the Type.
Would still like to modularize it more and make it one Function that goes through the data 4 times and fills in each tab page properly.
Works clumsily now, but still hoping to refine it,
Larry
|
|
|
|
|
Your problem with that is what you thought it was. frm only knows about the controls added directly to it. Containers have their own controls and the object that the container is added to knows nothing directly about it's children.
You can access it through Me.TabPage1 because it's a variable that was declared within the form, but it was never added to the forms control collection, it was added to the tabControl's control collection.
If you want to be able to search through children controls as well, you could do that using a modified version of what I posted earlier.
Public Shared Function getControlArray(ByVal baseControl As Control, _
ByVal controlName As String, _
ByVal TypeToReturn As Type, _
Optional ByVal separator As String = "") As Control()
Dim aList As New ArrayList
For Each ctrl As Control In baseControl.Controls
If ctrl.Controls.Count > 0 Then
For Each item As Control In getControlArray(ctrl, controlName, TypeToReturn, separator)
aList.Add(item)
Next
End If
If ctrl.Name.ToLower.StartsWith(controlName.ToLower & separator) And _
ctrl.GetType = TypeToReturn Then
aList.Add(ctrl)
End If
Next
Return aList.ToArray(TypeToReturn)
End Function
I just made the Form being passed in a Control instead and check that control for any children, then it recursively checks the children. I tested it by adding a TabControl and several Labels to a TabPage and it works as expected.
You can also just pass in the TabPage if you know that the items will only be on that TabPage.
|
|
|
|
|
|
How are you trying to do this at the moment?
Where is it failing?
Why are you trying to 'pinch' a captcha, there are numerous articles on how to produce your own.
Henry Minute
Do not read medical books! You could die of a misprint. - Mark Twain
Girl: (staring) "Why do you need an icy cucumber?"
“I want to report a fraud. The government is lying to us all.”
Why do programmers often confuse Halloween and Christmas?
Because 31 Oct = 25 Dec.
|
|
|
|
|
Hi..all Codeproject members...
I got a vb.net code i got from codeproject..
this code is a class to load a sqldatareader into a listview
and this is the code
Imports System.Data.SqlClient
Public Class ListViewData
Public Sub FillListView(ByRef MyListView As ListView, _
ByRef myData As SqlDataReader)
Dim lvwColumn As ColumnHeader
Dim itmListItem As ListViewItem
Dim shtCntr As Short
MyListView.Clear()
For shtCntr = 0 To myData.FieldCount() - 1
'If shtCntr = 1 Then Continue For
lvwColumn = New ColumnHeader()
lvwColumn.Text = myData.GetName(shtCntr)
MyListView.Columns.Add(lvwColumn)
If shtCntr = 0 Then lvwColumn.Width = 125
If shtCntr = 1 Then lvwColumn.Width = 300
Next
Do While myData.Read
itmListItem = New ListViewItem()
itmListItem.Text = myData(0)
For shtCntr = 1 To myData.FieldCount() - 1
'If shtCntr = 1 Then Continue For
If myData.IsDBNull(shtCntr) Then
itmListItem.SubItems.Add("")
Else
itmListItem.SubItems.Add(myData.GetString(shtCntr))
End If
Next shtCntr
MyListView.Items.Add(itmListItem)
Loop
End Sub
End Class
And this is how i use this code
Private Sub Usage_ListItem_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim con As SqlConnection = New SqlConnection(constr)
Dim query As String
query = "SELECT ItemCode [Item Code], ItemName[Item Name] FROM IC_ITEMS"
con.Open()
Dim comtext As SqlCommand = New SqlCommand()
comtext.Connection = con
comtext.CommandText = query
Dim reader As SqlDataReader
reader = comtext.ExecuteReader
Dim testlist As ListViewData = New ListViewData
testlist.FillListView(ListView1, reader)
comtext = Nothing
con.Close()
End Sub
The problem is i just want to load only ItemName Reader into the listview..
how can i modify this code
at least
thx for codeproject members attention..
|
|
|
|
|
Your best bet is to ask this on the forum of the article where you got the code.
But I'll take as stab at it.
If you only want the itemname column in your listview then all you have to do is change your SQL statement
from:
"SELECT ItemCode [Item Code], ItemName[Item Name] FROM IC_ITEMS"
to:
"SELECT ItemName[Item Name] FROM IC_ITEMS"
and you should have only your itemname column in the listview
|
|
|
|
|
i mean i want to use the itemcode into another control
|
|
|
|
|
If you want to use the different items in different controls, then something like this:
reader = comtext.ExecuteReader
Dim itemCodeIndex, itemNameIndex As Integer
itemCodeIndex = reader.GetOrdinal("ItemCode")
itemNameIndex = reader.GetOrdinal("ItemName")
While reader.Read()
ListView1.Items.Add(reader.GetValue(itemCodeIndex))
ListView2.Items.Add(reader.GetValue(itemNameIndex))
End While
|
|
|
|
|
and how is i have 3 reader and i want use 2 reader into list view 1
and 1 reader into listview2
|
|
|
|
|
I don't understand your question
|
|
|
|
|
ok...this all completely done...thx
|
|
|
|
|
Dear Administrator,
My problem is as follows :
My PM has asked me to create a new button with the name "Tasks" on the Outlook page. When this button is pressed , the control should go to a form containing details regarding the tasks to be performed by the employees.
I have created the necessary form by using Visual Basic Express Edition.
The form is also supposed to have a "send" button.
When the "send" button is pressed, the details should be stored in the database and Outlook Page has to come up.
When I click the "Tasks" button in the outlook page once again, the control should go to the same form containing all the details.
Any changes made in the form are to be saved in the database and when the "send" button on the form is pressed, the control has to again come back to the Outlook page.
This is the problem. I am using Visual Basic Express Edition for creating this facility.
Please tell me the procedure as to how to do this work.
Actually, I am working as a Design and Development Engineer in TATA ELXSI. Please answer to my message as quickly as possible. I have to release the product before the second week of June.
Regards,
Suragala Srinivasa Rao,
Design and Development Engineer,
TATA ELXSI LIMITED,
Technopark, Trivandrum-695581, Kerala, India.
Cell Number : 9037595866
Email address : suragalarao@tataelxsi.co.in
|
|
|
|
|
S.Srinivasa Rao wrote: Design and Development Engineer,
This does not sit easy with Express Edition!
However, Cookies could be your friend on this problem.
------------------------------------
I will never again mention that I was the poster of the One Millionth Lounge Post, nor that it was complete drivel. Dalek Dave
|
|
|
|
|
S.Srinivasa Rao wrote: Dear Administrator,
There only a few administrators here and not many of them check these forums.
S.Srinivasa Rao wrote: Please tell me the procedure as to how to do this work.
Nobody is going to just give you a complete solution for this, do your own work, research, ... that's what you get paid to do.
S.Srinivasa Rao wrote: Suragala Srinivasa Rao,
Design and Development Engineer,
TATA ELXSI LIMITED,
[adres removed]
Cell Number : [removed]
Email address : [removed]
You must really like spam.
NEVER post your email adres on a public forum, same goes for your phone number and adres.
Nobody is going to contact you using them so remove them from your message.
|
|
|
|
|
S.Srinivasa Rao wrote: I have to release the product before the second week of June.
I'd suggest to wait with the release until the product is "working".
I are Troll
|
|
|
|
|
Eddy Vluggen wrote: wait with the release until the product is "working"
That is not an entrepreneurial spirit; release dates should be upheld. Turnover has to ramp up.
Change the bloody specs if you must. Cripple it, save some for the next release.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
Luc Pattyn wrote: That is not an entrepreneurial spirit; release dates should be upheld. Turnover has to ramp up.Change the bloody specs if you must. Cripple it, save some for the next release.
I know, it's a common attitude. I'm imagining a large-mouthed tie, explaining the cook that one has to serve the eggs on time, even if they are rotten and it would kill the customer.
I are Troll
|
|
|
|
|
Hello, this is Vikash Gohil.
I have Created a Windows Service which does the following when service is started :
Connects SQL Server 2000 Database.
Starts a Threads.
Thread executes a while loop
In the while loop,
Current system time is taken using : format(now,"HH:mm")
A Query is made to a Table in Database to look for records as below.
"Select <FieldName> From <tableName> Where <FieldName>='" & format(now,"HH:mm") & "'"
if any record exists, then a particular procedure gets executed.
The above code continues to run in a while loop 24/7
The problem I am facing is, the service takes aroung 98% CPU Usage.
The Database Table contains only 20 to 25 records.
I want to know why this thing is happening.
Is it bcoz of the while loop. If yes, then what to use instead of while loop?
I Can't change the Service functionality as it is a client requirement.
Please can anyone guide me in this matter.
Any help would be greatly appreciated.
Thanks in Advance, awaiting a reply soon.
|
|
|
|
|
Consider using System.Threading.Thread.Sleep( int milliseconds ) .
That should unburden the processor.
Cheers
I don't like my signature at all
|
|
|
|
|
Hello, Estys.
Thanks for your reply.
I thought of using Sleep.
But many posts on the net suggest that using Sleep is a bad practice.
So is there any risks or disadvantages in using Sleep.
Please reply if you know anything about this.
Thanks Again.
|
|
|
|
|
VikashGohil wrote: But many posts on the net suggest that using Sleep is a bad practice.
Many things are 'Bad Practice' but they still get done.
Have you never used a GOTO?
------------------------------------
I will never again mention that I was the poster of the One Millionth Lounge Post, nor that it was complete drivel. Dalek Dave
|
|
|
|
|