为什么我得到这个NullReferenceException C#

时间:2011-12-23 22:55:28

标签: c# datagridview error-handling nullreferenceexception

我一直在使用一些代码来处理通过Active目录查询来管理连接用户和设备的应用程序。

然后我得到这个错误“NullReferenceException未处理”大约一个星期,使用代码这是唯一阻止应用程序的东西。

这是我使用的背景代码:

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);
    }
}

这是例外细节,抱歉它们是西班牙语。

    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()

4 个答案:

答案 0 :(得分:9)

这是一个多线程问题。在某些时候,您正试图在屏幕上绘制自己的同一时间更改数据网格的数据源。

 dgvComputers1.DataSource = dt;

尝试将其替换为:

 this.Invoke(delegate(DataTable table)
 {
     dgvComputers1.DataSource = table;
 }, dt);

答案 1 :(得分:1)

你试过这个吗?

dr[1] = IPAddress ?? "(unknown)";

答案 2 :(得分:0)

尝试放入断点(如果您使用的是Visual Studio)并检查每一行并查看错误发生的位置。

然后,在到达该行后,检查监视窗口以查看什么是空。

然后在发生错误的行之前转到:if(nullThing == null) return;,当然,你不应该总是这样做,而是找出它为什么为空,并将其排序。

那应该做的。

答案 3 :(得分:-2)

检查出来:

`private void backgroundWorker2_Dowork(object sender, DoWorkEventArgs e)

删除

`

应该是:

private void backgroundWorker2_Dowork(object sender, DoWorkEventArgs e)