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()
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);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With