问题描述
||
我构建了一个包含标签的简单自定义控件。在自定义控件的代码背后,我试图设置标签的文本,但出现空引用错误。有任何想法吗?
protected void Page_Load(object sender,EventArgs e)
{
sqlConnection connection = new sqlConnection(GetConnectionString());
connection.open();
sqlCommand cmd = new sqlCommand(\"displayCustomerReviews\",connection);
cmd.CommandType = CommandType.StoredProcedure;
XmlReader reader = cmd.ExecuteXmlReader();
//while (reader.Read())
while (!reader.EOF)
{
reader.ReadToFollowing(\"review\");
reader.MovetoAttribute(\"Name\");
string Name = reader.Value;
reader.MovetoAttribute(\"Message\");
string Message = reader.Value;
reader.MovetoAttribute(\"rating\");
string rating = reader.Value;
reader.MovetoAttribute(\"Date\");
string Date = reader.Value;
reader.MovetoAttribute(\"Time\");
string Time = reader.Value;
CreateReviewPanel(Name,Message,rating,Date,Time);
}
reader.Close();
connection.Close();
}
private string GetConnectionString()
{
return ConfigurationManager.AppSettings[\"sqlConn\"];
}
private void CreateReviewPanel(string Name,string Message,string rating,string Date,string Time)
{
// need to check against nulls or empty strings to avoid
// extra reviewPanel being created at end of XML read.
if (Name != \"\")
{
Guid panelID = Guid.NewGuid();
Panel reviewPanel = new Panel();
reviewPanel.ID = panelID.ToString();
nameLabel.Text = Name;
messageLabel.Text = Message;
dateLabel.Text = Date;
timeLabel.Text = Time;
switch (rating)
{
case \"1\":
ratingImage.ImageUrl = \"~/images/one-star.gif\";
break;
case \"2\":
ratingImage.ImageUrl = \"~/images/two-stars.gif\";
break;
case \"3\":
ratingImage.ImageUrl = \"~/images/three-stars.gif\";
break;
case \"4\":
ratingImage.ImageUrl = \"~/images/four-stars.gif\";
break;
case \"5\":
ratingImage.ImageUrl = \"~/images/five-stars.gif\";
break;
}
}
}
}
错误出现的位置\'nameLabel.Text = Name \',随后发生所有其他分配。
解决方法
nameLabel是页面上控件的ID吗?如果不是,则需要执行以下操作:
Label nameLabel = this.lblSomeControlID;
为了使nameLabel引用任何有效的内容。
,我发现了问题。正是我的default.aspx.cs中的代码试图在创建每个自定义控件时将其作为控件添加到默认页面上的另一个面板中。问题是当XMLreader再进行一次循环并返回null时。后面的自定义控件代码无法分配空值。我感谢每个人的评论……可能如此复杂。
,您应该在代码中添加try ... catch例程,直到您解决了这个问题。
由于使用文本值,因此在很多地方都可能会出现空引用异常。
protected void Page_Load(object sender,EventArgs e) {
string conn = GetConnectionString();
if (String.IsNullOrEmpty(conn)) {
Console.WriteLine(\"No Connection String!\");
return;
}
try {
SqlConnection connection = new SqlConnection(conn);
connection.Open();
SqlCommand cmd = new SqlCommand(\"DisplayCustomerReviews\",connection);
cmd.CommandType = CommandType.StoredProcedure;
XmlReader reader = cmd.ExecuteXmlReader();
while (!reader.EOF) {
reader.ReadToFollowing(\"review\");
reader.MoveToAttribute(\"Name\");
string Name = reader.Value;
reader.MoveToAttribute(\"Message\");
string Message = reader.Value;
reader.MoveToAttribute(\"Rating\");
string Rating = reader.Value;
reader.MoveToAttribute(\"Date\");
string Date = reader.Value;
reader.MoveToAttribute(\"Time\");
string Time = reader.Value;
CreateReviewPanel(Name,Message,Rating,Date,Time);
}
reader.Close();
connection.Close();
} catch (Exception err) {
Console.WriteLine(\"Possible Problems:\");
Console.WriteLine(\"DisplayCustomerReviews was not found or spelled incorrectly\");
Console.WriteLine(\"One or more of the attributes listed above do not exist.\");
Console.WriteLine(err.Message);
}
}
private string GetConnectionString() {
string connStr = null;
try {
connStr = ConfigurationManager.AppSettings[\"SQLConn\"];
} catch (Exception err) {
Console.WriteLine(\"AppSettings is incorrect or does not contain SQLConn\");
Console.WriteLine(err.Message);
}
return connStr;
}
private void CreateReviewPanel(string Name,string Message,string Rating,string Date,string Time) {
if (!String.IsNullOrEmpty(Name)) //need to check against nulls or empty strings to avoid extra reviewPanel being created at end of XML read.
{
Guid panelID = Guid.NewGuid();
Panel reviewPanel = new Panel();
try {
reviewPanel.ID = panelID.ToString();
} catch (Exception) {
Console.WriteLine(\"Panel Object does not contain an ID property.\");
Console.WriteLine(err.Message);
}
nameLabel.Text = Name;
messageLabel.Text = Message;
dateLabel.Text = Date;
timeLabel.Text = Time;
try {
switch (Rating) {
case \"1\":
ratingImage.ImageUrl = \"~/images/one-star.gif\";
break;
case \"2\":
ratingImage.ImageUrl = \"~/images/two-stars.gif\";
break;
case \"3\":
ratingImage.ImageUrl = \"~/images/three-stars.gif\";
break;
case \"4\":
ratingImage.ImageUrl = \"~/images/four-stars.gif\";
break;
case \"5\":
ratingImage.ImageUrl = \"~/images/five-stars.gif\";
break;
}
Console.WriteLine(\"File Check: \",ratingImage.ImageUrl);
Console.WriteLine(File.Exists(ratingImage.ImageUrl));
} catch (Exception err) {
Console.WriteLine(\"This control type does not contain an ImageUrl property\");
Console.WriteLine(err.Message);
}
}
}
,该代码应类似于以下内容:
private void CreateReviewPanel(string Name,string Time)
{
if (Name != \"\") //need to check against nulls or empty strings to avoid extra reviewPanel being created at end of XML read.
{
Guid panelID = Guid.NewGuid();
ReviewPanel reviewPanel = new ReviewPanel();
reviewPanel.ID = panelID.ToString();
reviewPanel.nameLabel.Text = Name;
reviewPanel.messageLabel.Text = Message;
reviewPanel.dateLabel.Text = Date;
reviewPanel.timeLabel.Text = Time;
switch (Rating)
{
case \"1\":
reviewPanel.ratingImage.ImageUrl = \"~/images/one-star.gif\";
break;
case \"2\":
reviewPanel.ratingImage.ImageUrl = \"~/images/two-stars.gif\";
break;
case \"3\":
reviewPanel.ratingImage.ImageUrl = \"~/images/three-stars.gif\";
break;
case \"4\":
reviewPanel.ratingImage.ImageUrl = \"~/images/four-stars.gif\";
break;
case \"5\":
reviewPanel.ratingImage.ImageUrl = \"~/images/five-stars.gif\";
break;
}
}
}
}