6

I've been working in some codes for an application to manage connected users and Equipments via Active directory queries.

Then I get this error "NullReferenceException was unhandled" for about a week, working with the code this is the only thing stopping the application now.

And this is the code of the background worked I used:

private void backgroundWorker2_Dowork(object sender, DoWorkEventArgs e)
{
    try
    {
        e.Result = "";

        int val = 6000;

        for (int a = 1; a <= val; a++)
        {
            counter.Text = Convert.ToString(a);
            if (txtWorkGroupName.Text == "") return;

            DataTable dt = new DataTable();
            dt.Clear();

            dt.Columns.Add(new DataColumn("ComputerName", typeof(String)));                        //0
            dt.Columns.Add(new DataColumn("IP", typeof(String)));            //1
            dt.Columns.Add(new DataColumn("MAC", typeof(String)));       //2
            dt.Columns.Add(new DataColumn("Descubierto", typeof(String)));       //3
            //int i = 0;

            try
            {
                // Datos del grupo WinNT://&&&&(Nombre del grupo de trabajo)
                DirectoryEntry DomainEntry = new DirectoryEntry("WinNT://" +  txtWorkGroupName.Text + "");
                DomainEntry.Children.SchemaFilter.Add("Computer");


                ///*************************************************
                /// Interacting with pc's in the domain
                ///*************************************************

                foreach (DirectoryEntry machine in DomainEntry.Children)
                {
                    string strMachineName = machine.Name;
                    string strMACAddress = "";
                    IPAddress IPAddress;
                    DateTime discovered;

                    try
                    {
                        IPAddress = getIPByName(machine.Name);
                    }
                    catch
                    {
                        continue;
                    }//try/catch

                    ///*************************************************
                    /// Get Mac
                    ///*************************************************
                    strMACAddress = getMACAddress(IPAddress);

                    discovered = DateTime.Now;
                    ///*************************************************
                    /// Add lines in the grid
                    ///*************************************************

                    DataRow dr = dt.NewRow();


                    dr[0] = machine.Name;
                    dr[1] = IPAddress;
                    dr[2] = strMACAddress;
                    dr[3] = Convert.ToString(discovered);
                    dt.Rows.Add(dr);

                ///*************************************************
                /// SETTING DATASOURCE
                ///*************************************************
                    dgvComputers1.DataSource = dt;


                    Thread.Sleep(2000);

                }//foreach loop


            catch (Exception ex)
            {
                {
                    MessageBox.Show(ex.Message);
                }
            }


            if (backgroundWorker2.CancellationPending)
            {
                e.Cancel = true;
                return;
            }
        }
    }
    catch (NullReferenceException ex)
    {
        MessageBox.Show("error:" + ex);
    }
    catch (NoNullAllowedException ex)
    {
        MessageBox.Show("error:" + ex);
    }
    catch (AccessViolationException ex)
    {
        MessageBox.Show("error:" + ex);
    }
}

This is the exception details, sorry that they are in Spanish.

    System.NullReferenceException was unhandled
    Message="Object reference not set to an instance of an object."
      Source="System.Windows.Forms"
    StackTrace:
   en System.Windows.Forms.DataGridViewRowHeaderCell.PaintPrivate(Graphics graphics,   Rectangle clipBounds, Rectangle cellBounds, Int32 rowIndex, DataGridViewElementStates dataGridViewElementState, Object formattedValue, String errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts, Boolean computeContentBounds, Boolean computeErrorIconBounds, Boolean paint)
   en System.Windows.Forms.DataGridViewRowHeaderCell.Paint(Graphics graphics, Rectangle  clipBounds, Rectangle cellBounds, Int32 rowIndex, DataGridViewElementStates cellState,  Object value, Object formattedValue, String errorText, DataGridViewCellStyle cellStyle,  DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
   en System.Windows.Forms.DataGridViewCell.PaintWork(Graphics graphics, Rectangle  clipBounds, Rectangle cellBounds, Int32 rowIndex, DataGridViewElementStates cellState,  DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle,   DataGridViewPaintParts paintParts)
   en System.Windows.Forms.DataGridViewRow.PaintHeader(Graphics graphics, Rectangle  clipBounds, Rectangle rowBounds, Int32 rowIndex, DataGridViewElementStates rowState,   Boolean isFirstDisplayedRow, Boolean isLastVisibleRow, DataGridViewPaintParts paintParts)
   en System.Windows.Forms.DataGridViewRow.Paint(Graphics graphics, Rectangle clipBounds, Rectangle rowBounds, Int32 rowIndex, DataGridViewElementStates rowState, Boolean isFirstDisplayedRow, Boolean isLastVisibleRow)
   en System.Windows.Forms.DataGridView.PaintRows(Graphics g, Rectangle boundingRect, Rectangle clipRect, Boolean singleHorizontalBorderAdded)
   en System.Windows.Forms.DataGridView.PaintGrid(Graphics g, Rectangle gridBounds, Rectangle clipRect, Boolean singleVerticalBorderAdded, Boolean singleHorizontalBorderAdded)
   en System.Windows.Forms.DataGridView.OnPaint(PaintEventArgs e)
   en System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
   en System.Windows.Forms.Control.WmPaint(Message& m)
   en System.Windows.Forms.Control.WndProc(Message& m)
   en System.Windows.Forms.DataGridView.WndProc(Message& m)
   en System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   en System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   en System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
   en System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
   en       System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.        IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
   en System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason,   ApplicationContext context)
   en System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   en System.Windows.Forms.Application.Run(Form mainForm)
   en NetworkScanner.Program.Main() en C:\Project Sigma 6\New Power  move\discover\Program.cs:línea 17
   en System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
   en System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   en Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   en System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   en System.Threading.ExecutionContext.Run(ExecutionContext executionContext,  ContextCallback callback, Object state)
   en System.Threading.ThreadHelper.ThreadStart()
Cœur
  • 37,241
  • 25
  • 195
  • 267
  • 1
    I am not sure why this question has been downvoted so badly. Would anyone care to leave a comment? I mean, obviously, the OP is somewhat, eh, formatting-challenged, and english-challenged, but haven't we all seen worse? – Mike Nakis Dec 23 '11 at 23:07
  • What returns this java style function `getIPByName(machine.Name);`? null? Or does it throw exception? – L.B Dec 23 '11 at 23:10
  • @OP - Please debug through your code and show us the specific line this is occurring on. – Stefan H Dec 23 '11 at 23:15
  • Is it always failing or just now and then? – rene Dec 23 '11 at 23:30

4 Answers4

16

It's a multithreading issue. At some point you're trying to change the datasource of your datagrid at the exact same time it's painting itself on screen.

 dgvComputers1.DataSource = dt;

Try replacing that by:

 this.Invoke(delegate(DataTable table)
 {
     dgvComputers1.DataSource = table;
 }, dt);
Kevin Gosse
  • 38,392
  • 3
  • 78
  • 94
1

Have you tried this?

dr[1] = IPAddress ?? "(unknown)";
Mike Nakis
  • 56,297
  • 11
  • 110
  • 142
  • its a column line error manage that is not been done.... and i dont know how to add a column first if its trying to fill a line – Luis Nuesi Tejada Dec 23 '11 at 23:11
  • I do not understand what you are saying, and it does not look like you are answering me whether you have tried this or not. So, let me repeat my answer in a different way: replace your line `dr[1] = IPAddress;` with `dr[1] = IPAddress ?? "(unknown)";` – Mike Nakis Dec 23 '11 at 23:17
  • i have a procces attached to that i cant change like that – Luis Nuesi Tejada Dec 23 '11 at 23:35
  • I in that point is introduced a method that extracts the ipaddress from the remote computer... without having to ping the equipment just because im gathering information directly in AD impersonating my Access level – Luis Nuesi Tejada Dec 24 '11 at 00:10
0

Try putting a breakpoint in (if you are using Visual Studio) and checking each line and see where the error occurs.

Then, after getting to the line, check in the watch window to see what is null.

Then go: if(nullThing == null) return; before the line where the error occurs, of course, you shouldn't always do this, but find out WHY it is null, and sort it out.

That should do the job.

H Bellamy
  • 22,405
  • 23
  • 76
  • 114
  • For debugging purposes... Right? Because that does not sound like a way to actually solve the problem... it is merely avoiding the problem. – Stefan H Dec 23 '11 at 23:08
  • ive set an error manager to throw the exeptions so i can read them and i found this.... "AL control datagridview can't add no line with no columns, columns must be added first..." then comes the error – Luis Nuesi Tejada Dec 23 '11 at 23:09
  • @StefanH Yes, but once you find the problem, identify it, and see where it is coming from, and solve it :-) – H Bellamy Dec 23 '11 at 23:10
  • @HBellamy but what would make adding your suggestion, to completely bypass the issue, at all helpful in determining the cause of the problem? – Stefan H Dec 23 '11 at 23:14
-2

Check this out:

`private void backgroundWorker2_Dowork(object sender, DoWorkEventArgs e)

Delete that

`

It should be:

private void backgroundWorker2_Dowork(object sender, DoWorkEventArgs e)
parek
  • 772
  • 1
  • 13
  • 41