对象未设置为对象错误的实例(阻止通过错误查找的步骤)

时间:2013-11-28 16:09:58

标签: c# winforms

我有一个用c#

编写的winforms应用程序

有一个按钮可以从模板生成文档。

用户在文本框中键入新文档的名称,然后从数据网格中选择要将文档发送到的业务。

当我点击按钮时,我得到一个'对象未设置为实例错误'。

这是事件处理程序

private void btnCreateDocument_Click(object sender, EventArgs e)
        {
            try
            {
                #region Validation

                if (txtCreateDocName.Text.Length == 0)   //...BreakPoint here
                {
                    MessageBox.Show("Please enter a Name for your new Document", "Missing Document Name");
                    return;
                }

                if (selectedBusiness == null)
                {
                    MessageBox.Show("Please select a Contact or Business to send this Document to", "No Business Selected");
                    return;
                }

                #endregion

                DataGridViewRow row = (DataGridViewRow)dataTemplates.CurrentCell.OwningRow;

                string templatePath = row.Cells["Path"].Value.ToString();                
                string fileName = txtCreateDocName.Text;
                string caseFolder = txtFolder.Text;                
                string ourRef = currentCase.DisplayNo;
                string caseHeader = currentCase.Claimant + " -v- " + currentCase.Defendant;

                string address = selectedBusiness.Name + Environment.NewLine +
                                 selectedBusiness.Address1;
                if (selectedBusiness.Address2 != null)
                {
                    address += Environment.NewLine + selectedBusiness.Address2;
                }
                if (selectedBusiness.Address3 != null)
                {
                    address += Environment.NewLine + selectedBusiness.Address3;
                }
                address += Environment.NewLine + selectedBusiness.Region
                         + Environment.NewLine + selectedBusiness.Postcode;

                string salutation = "Dear ";
                if (selectedContact != null)
                {
                    salutation += selectedContact.Title + " " + selectedContact.FirstName + " " + selectedContact.Surname;
                }
                else
                {
                    salutation += "Sirs";
                }

                string childTable;
                int childID;
                if(selectedContact != null)
                {
                    childTable = "Contact";
                    childID = selectedContact.ID;
                }
                else
                {
                    childTable = "Business";
                    childID = selectedBusiness.ID;
                }
                int linkID = Link.LocateLink("Case", currentCase.ID, childTable, childID);
                Link l = new Link(linkID);
                string yourRef = l.Reference;

                string docPath = Document.CreateLetter(fileName, templatePath, caseFolder, address, salutation, yourRef, ourRef, caseHeader);
            }
            catch (Exception ex)
            {
                MessageBox.Show("frmCase: btnCreateDocument_Click()" + Environment.NewLine + ex.Message);
            }
        }

现在真正令人困惑的是,当我在这个事件处理程序的第一行设置一个断点时,我仍然得到错误而没有明显达到断点?!

但是,如果我不在txtCreateDocName中输入文档名称,则会到达MessageBox警告。这表示单击按钮时会调用事件处理程序,因此当我在txtCreateDocName中输入内容时,为什么错误没有到达断点。

其他信息

这甚至更奇怪了。在运行代码时,我尝试放置/移动断点并收到警告,说源代码与原始代码不同。我发现了以下thread。从阅读这些评论,我相信这可能发生在我的项目中,因为我改变了系统时钟,以便让我输入一些历史数据用于测试目的。但是,该线程中没有任何解决方案可以正常工作。

此外,我甚至尝试删除所有Validation #region,包括有关输入文档名称的MessageBox。但是,当我再次运行代码并且无法输入文档名称时,我的屏幕上会出现消息框,即使我已从代码中删除它。

好像,我的代码有一个看不见的旧版本正在运行,而不是我在VS中看到的当前版本。如果有人能提出解决这个最不寻常的错误的方法,我将非常感激。

这更加严重

我决定放弃我正在处理的应用程序的一部分,并对另一个表单进行了重大更改。但是,当我运行应用程序时,我所做的任何更改都没有生效。因此,在Visual Studio中,我正在寻找一个包含所有新控件和代码的解决方案,但在运行时,我似乎正在获得“以前的”未改变的解决方案。

请任何人帮我解决这个问题,因为它看起来像是在破坏数月的工作。

2 个答案:

答案 0 :(得分:1)

在与一位长期从事软件工作的朋友交谈后,我终于能够解决这个问题了。这个解决方案并不奇怪,最终很简单。

当我更改系统时钟以输入一些历史数据时,错误已经开始。真正搞砸的是我也改变了时钟(未来)。看来这意味着应用程序DLL上的日期戳与VS中的模块不匹配。通过Debug菜单重建不起作用,因为dll的日期比VS中的模块更新,因此它没有看到任何更新。

解决方案是手动删除bin文件夹中的所有内容,使VS无需运行,并强制它从头开始重建应用程序。现在一切都应该再次起作用了,这是多么令人欣慰的事情。

希望有一天这可能会帮助别人。

答案 1 :(得分:0)

您是否在该文本控件上有任何'keypress'处理程序或'textchange'验证程序?也许是他们抛出的。当你在控件中“不写任何东西”时,没有按键和没有验证 - 所以调用了ButtonClick。但是,如果对文本进行了任何更改,则文本控件将在“失去焦点”时触发更改处理程序,因此在“单击”之后立即触发,但在焦点移动到按钮之前,按钮会注意到单击。这样,如果文本更改处理程序抛出,将抛出异常,就好像“当您单击”但没有按钮点击处理程序将触发时。尝试在该控件中输入相同的文本然后不要单击 - 按TAB或ENTER以使其失去焦点。如果发生异常,那么它肯定是更改处理程序(或keylistener,或Binding解析器,或者...... - 我不知道你有什么)。

另外,你检查了抛出的异常的StackTrace吗?它会告诉你究竟抛出了哪种方法。

最后,您可以转到Debug菜单,进入Exceptions并找到System.NullReferenceException并将其标记为“何时抛出”。现在,只要抛出此异常,VS就会自动BREAK,它会立即跳转到抛出它的代码位置。这样你就会立刻看到罪魁祸首。别忘了稍后取消选中该选项。