Строки и элементы управления в ASP.NET WebForms - PullRequest
1 голос
/ 24 марта 2011

почему изображения не могут быть добавлены в div в asp?

divHtml.append(img);

, почему я должен использовать div.controls.add(img);?

и почему я не могу добавить строку в элементы управления.добавить скажи вот так

div.controls.add(img + String.Format("{0}", reader.GetString(0));

?Обычно "В начале"

У меня был этот код:

    cn.Open();
    using (OdbcCommand cmd = new OdbcCommand("SELECT Wallpostings FROM WallPosting WHERE UserID=" + theUserId + " ORDER BY idWallPosting DESC", cn))

    using (OdbcDataReader reader = cmd.ExecuteReader())
    {
        var divHtml = new System.Text.StringBuilder();
        while (reader.Read())
        {
            divHtml.Append("<div id=test>");
            divHtml.Append(String.Format("{0}", reader.GetString(0)));
            divHtml.Append("</div>");
        }


        test1.InnerHtml = divHtml.ToString();

    }
}

}

, который дал мне этот вывод (обратите внимание, что CSS применяется и все интервалы и т. Д.красиво и аккуратно:

enter image description here

Затем я сделал этот код:

            while (reader.Read())
            {
                System.Web.UI.HtmlControls.HtmlGenericControl div = new System.Web.UI.HtmlControls.HtmlGenericControl("div");
                //div.ID = "test";
                div.Style["float"] = "left";
                Image img = new Image();
                img.ImageUrl = "~/userdata/2/uploadedimage/batman-for-facebook.jpg";
                img.AlternateText = "Test image";
                div.Controls.Add(img);
                test1.Controls.Add(div);

                System.Web.UI.HtmlControls.HtmlGenericControl div1 = new System.Web.UI.HtmlControls.HtmlGenericControl("div");
                //div1.ID = "test";
                div1.InnerText = String.Format("{0}", reader.GetString(0));

                div1.Style["float"] = "left";
                test1.Controls.Add(div1);

                System.Web.UI.HtmlControls.HtmlGenericControl div2 = new System.Web.UI.HtmlControls.HtmlGenericControl("div");
                //div2.ID = "test";
                div2.Style["clear"] = "both";
                test1.Controls.Add(div2);
            }
        }
    }
}

}

И это был мой результат, который в порядке, ноесли вы заметили, что между каждым комментарием нет css, div'ы находятся за пределами моего css, я попытался применить закомментированные строки, чтобы посмотреть, сработает ли это, но это просто abit funky tbh. Особенно, если вы посмотрите на это в firebug:1027 *

enter image description here Вот что произойдет, если я попытаюсь разобрать элемент управления, используя метод, указанный ниже:

    cn.Open();
    using (OdbcCommand cmd = new OdbcCommand("SELECT Wallpostings FROM WallPosting WHERE UserID=" + userId + " ORDER BY idWallPosting DESC", cn))
    {
        using (OdbcDataReader reader = cmd.ExecuteReader())
        {
            test1.Controls.Clear();

            while (reader.Read())
            {
                System.Web.UI.HtmlControls.HtmlGenericControl div = new System.Web.UI.HtmlControls.HtmlGenericControl("div");

                div.ID = "test";
                div.Style["float"] = "left";
                Image img = new Image();
                img.ImageUrl = "~/userdata/2/uploadedimage/batman-for-facebook.jpg";
                img.AlternateText = "Test image";

                div.Controls.Add(img);
                div.Controls.Add(ParseControl(String.Format("{0}", reader.GetString(0))); 

                test1.Controls.Add(div);

enter image description here

Редактировать:

        using (OdbcDataReader reader = cmd.ExecuteReader())
        {
            test1.Controls.Clear();

            while (reader.Read())
            {
        System.Web.UI.HtmlControls.HtmlGenericControl div = new System.Web.UI.HtmlControls.HtmlGenericControl("div");
        div.Attributes["class"] = "test";
        div.Style["float"] = "left";

        div.ID = "test";
        //div.Style["float"] = "left";
        Image img = new Image();
        img.ImageUrl = "~/userdata/2/uploadedimage/batman-for-facebook.jpg";
        img.AlternateText = "Test image";

        div.Controls.Add(img);
        div.Controls.Add(ParseControl(String.Format("{0}", reader.GetString(0)))); 

        test1.Controls.Add(div);

Shadow удалось заставить это работать, и я также использовал синтаксический анализ из другого комментария.

Но проблема остается теперь с test1 div, не расширяющимся с тестовыми div:

enter image description here

        <asp:Button ID="Button1" runat="server" Text="Post Message" Width="98px" 
            onclick="Button1_Click" />
        </p>
    <p>
    </p>
        <div id="test1" runat="server" />
//could be this line
    </asp:Content>

Или это может быть

test1.Controls.Add(div); 

в моем коде, который не будет поднят или в ковозможно, правильные скобки?css:

div#test1 
{

}
div .test
{
  width:90%; 
  z-index:1; 
  padding:27.5px; 
  border-top: thin solid #736F6E;
  border-bottom: thin solid #736F6E;
  color:#ffffff;
  margin:0 auto;
  white-space: pre;
  white-space: pre-wrap;
  white-space: pre-line;
  word-wrap: break-word;
}

Ответы [ 5 ]

4 голосов
/ 24 марта 2011

img имеет тип System.Web.UI.Control, который является типом, принятым Controls.Add.В частности, System.Web.UI.Control - это не то же самое, что System.String.

Поскольку C # является языком со строгой типизацией, метод, принимающий System.Web.UI.Control (например, Add на System.Web.UI.ControlCollection), не может принять System.String в качестве параметра.

Точно так же, предполагая, что divHtml является System.StringBuilder, не существует метода Append для System.StringBuilder, принимающего тип System.Web.UI.Control, поэтому попытка передать img всуществующий метод Append потерпит неудачу.

(У вас также могут возникнуть проблемы с компиляцией кода, поскольку вы не используете правильные имена для ваших методов и свойств; это Controls, а не controls,Add не add, а Append не append.)

2 голосов
/ 24 марта 2011

Если вы действительно хотите это, вы всегда можете создать метод расширения для этого:

public static class ControlExtensions
{
    public static void Add(this WebControl control, string html)
    {
        control.Controls.Add(new Literal
        {
            Text = html, Mode = LiteralMode.PassThrough
        });
    }
}

Теперь вы можете сделать это:

div.Controls.Add(String.Format("{0}", reader.GetString(0)));
1 голос
/ 24 марта 2011

Вы хотите добавить изображение плюс буквальный текст, поступающий из базы данных.

Правильный способ действительно добавить элементы управления - Image элемент управления, как у вас уже есть, и для текста используйте Literal контроль сервера:

div.Controls.Add(img);
div.Controls.Add(new LiteralControl(reader.GetString(0)));

Редактировать: если вы настаиваете на получении HTML-строки элемента управления изображением по вашим собственным причинам, это можно сделать с помощью следующего кода:

StringBuilder html = new StringBuilder();
using (StringWriter stringWriter = new StringWriter(html))
{
    using (HtmlTextWriter textWriter = new HtmlTextWriter(stringWriter))
    {
        image.RenderControl(textWriter);
    }
}

Это отобразит изображение в переменной html, затем вы можете назначить строковое значение для Text какого-либо другого элемента управления, как вы делали изначально. Например:

myLabel.Text = html.ToString();

Редактировать II: чтобы применить CSS к элементам управления, которые вы добавляете, сначала измените сам CSS с этого: div#test вместо этого: div .test

Теперь добавьте эту единственную строку в ваш код:

System.Web.UI.HtmlControls.HtmlGenericControl div = new System.Web.UI.HtmlControls.HtmlGenericControl("div");
div.Attributes["class"] = "test";
div.Style["float"] = "left";
...

Это будет применяться class к каждому верхнему уровню div, и это может быть использовано для применения правильного CSS.

1 голос
/ 24 марта 2011

вы можете добавить строки к элементу управления, вам придется использовать ParseControl (), который преобразует строки в элемент управления или как элемент управления

div.controls.add(ParseControl(String.Format("{0}", reader.GetString(0))); 
1 голос
/ 24 марта 2011

Потому что элементы управления - это не просто строки. Они являются объектами, которые становятся строками HTML, когда они на самом деле визуализируются. Прочитайте немного о контроле и жизненном цикле страницы в веб-формах asp.net.

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