Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why do I get this NullReferenceException C# [closed]

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()
like image 976
Luis Nuesi Tejada Avatar asked Dec 13 '22 06:12

Luis Nuesi Tejada


1 Answers

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);
like image 147
Kevin Gosse Avatar answered Dec 14 '22 22:12

Kevin Gosse