При назначении текста метке я получаю ссылку на объект, не установленную и экземпляр объекта - PullRequest
1 голос
/ 13 апреля 2011

Я создал простой пользовательский элемент управления, который содержит метки. В коде пользовательского элемента управления я пытаюсь установить текст метки, но получаю нулевую ссылку. Есть идеи?

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 - это место, где возникает ошибка, и впоследствии для всех других назначений.

Ответы [ 4 ]

0 голосов
/ 13 апреля 2011

Код должен выглядеть примерно так:

    private void CreateReviewPanel(string Name, string Message, string Rating, string Date, 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;
            }
        }
    }
}
0 голосов
/ 13 апреля 2011

Является ли nameLabel идентификатором элемента управления на странице? Если нет, вам нужно сделать:

Label nameLabel = this.lblSomeControlID;

Чтобы nameLabel ссылался на что-либо действительное.

0 голосов
/ 13 апреля 2011

Я нашел проблему. Это был код в моем default.aspx.cs, который пытался получить каждый пользовательский элемент управления по мере его создания и добавить его в качестве элемента управления на другую панель на странице по умолчанию. Проблема в том, что XMLreader делает еще один цикл и возвращает нули. Код пользовательского элемента управления не может присваивать значения NULL. Я ценю все комментарии ... настолько запутанные, насколько это возможно.

0 голосов
/ 13 апреля 2011

Вы должны добавить 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);
    }
  }
}
...