Объем проблемы LiteralControl - PullRequest
1 голос
/ 07 июня 2011

У меня есть кусок кода, который создает динамические элементы управления, используя 2 цикла while. Как вы можете видеть, я вынужден объявлять оба LiteralControls INSIDE каждый цикл while, потому что если я этого не сделаю, puBugList.Controls.Add(lineBreak) не подтвердит.

В: Почему я не вижу область действия элементов управления внутри цикла while?

    //this control is not acknowledged
    //LiteralControl lineBreak = new LiteralControl("<br/>"); 
    while (nwReader.Read())
    {
        int id = (int)nwReader["bid"];
        string user = (string)nwReader["buname"];
        string prob = (string)nwReader["bproblem"];
        string content = id + ". " + user + ": " + prob + "<br/>";
        Label lb = new Label();
        lb.Text = content;
        phBugList.Controls.Add(lb);

        //forced to declare 1 here
        LiteralControl lineBreak = new LiteralControl("<br/>");

        String sqlSelRep = "SELECT * FROM [reply] WHERE bid=@bid";
        SqlCommand cmdSelRep = new SqlCommand(sqlSelRep, conn);
        cmdSelRep.Parameters.AddWithValue("@bid", id);
        SqlDataReader repReader = cmdSelRep.ExecuteReader();
        while (repReader.Read())
        {
            //forced to declare another 
            LiteralControl lineBreak2 = new LiteralControl("<br/>");one here
            string msg = (string)repReader["rmsg"];
            Label lbRep = new Label();
            lbRep.Text = "Admin: \"" + msg + "\"";
            phBugList.Controls.Add(lbRep);
            phBugList.Controls.Add(lineBreak2);
        }
        repReader.Close();


        if (Convert.ToInt32(Session["user"]) == 1)
        {
            phBugList.Controls.Add(lineBreak);

            TextBox tbRep = new TextBox();
            tbRep.ID = "tb" + id.ToString();
            phBugList.Controls.Add(tbRep);

            LinkButton butRep = new LinkButton();
            butRep.ID = "rep" + id.ToString();
            butRep.Text = " Reply";
            butRep.Click += InsertReply;
            phBugList.Controls.Add(butRep);

            LinkButton butDel = new LinkButton();
            butDel.ID = "del" + id.ToString();
            butDel.Text = " Delete";
            butDel.Click += DeleteBug;
            phBugList.Controls.Add(butDel);

            phBugList.Controls.Add(lineBreak);
        }
        phBugList.Controls.Add(lineBreak);
    }

1 Ответ

1 голос
/ 07 июня 2011

Я думаю, что ваша проблема в том, что если вы создаете экземпляр LiteralControl вне цикла while, вы эффективно используете один и тот же объект во всем коде и не можете дважды добавить один и тот же элемент управления в коллекцию Controls другого элемента управления.

Попробуйте следующее:

 LiteralControl lineBreak = null;
 (...)

 while (repReader.Read())
 {
      literalControl = new LiteralContro(...);
 }

В любом случае, если вам не нужна область действия lineBreak вне цикла while, нет ничего плохого в объявлении переменной внутри цикла, поэтому ваш код в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...