我有一个用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中,我正在寻找一个包含所有新控件和代码的解决方案,但在运行时,我似乎正在获得“以前的”未改变的解决方案。
请任何人帮我解决这个问题,因为它看起来像是在破坏数月的工作。
答案 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,它会立即跳转到抛出它的代码位置。这样你就会立刻看到罪魁祸首。别忘了稍后取消选中该选项。