Zagnieżdżanie string'a w string'u - generowanie kodu html

0

Witam!
Potrzebuje pomocy przy rozwiązaniu. Mianowicie:
Tworzę string index, do którego chcę wpisywać wygenerowany kod html, który generuje mój program, na podstawie danych podanych w bazie.
Zawarłem w bazie informacje, który

znajduje się w jakim <divie>.
w formie</p>
id_diva in informacja
1 0 info
2 1 info
3 1 info
4 2 info
5 0 info
6 5 info
7 5 info
itd...
mniej więcej wygląda to tak, że nie wiem w jaki sposób zagnieździć wygenerowany string
, tak, żeby wylądował on w odpowiednim miejscu, oczywiście w zawartości odpowiedniego diva:
powyższy przykład z tabelki:
(html ma id 0)
<html> 
<div id="1">
   <div id="2">
      <div id="4"></div>
   </div>
   <div id="3"></div>
</div>
<div id="5">
   <div id="6"></div>
   <div id="7"></div>
</div>
</html>

Bardzo prosił bym o wsparcie - zarówno podpowiedzi w jaki sposób zagnieżdżać w string'u inny string, ale może i również wsparcie przy algorytmie.
Z góry dziękuje za pomoc.

1

pachnie mi to kompozytem (taki wzorzec projektowy)

jak znajdziesz i nadal nie będzie wiedział jak to ugryźć to napisz

aczkolwiek zastanów się czy nie można by do tego podejść jak do budowania XMLa, wykorzystując gotowe biblioteki z .NET -> w końcu HTML to taki XML

0

No własnie czytam o kompozycjach, mimo to ciężko mi to ugryźć.
A co do XML'a to niestety wydaje mi się, że nie zda to egzaminu, ponieważ ja tworzę w c# diva który wygląda tak:
Co za tym idzie, na podstawie danych z bazy tworze wygląd strony gotowej do wydruku i stąd potrzeba zagnieżdżania.

private string interpretacja(DataRow dr )
        {
            string interpretacja = "<div id =\"" + dr["w_nazwa"] + "\" ";
            interpretacja += "style=\"position:" + wybor_pozycji(dr["w_position"]) + ";";
            interpretacja += " float:" + float_jakie(dr["w_float"].ToString()) + ";";
            interpretacja += " top:" + dr["w_x"] + "mm;";
            interpretacja += " left:" + dr["w_y"] + "mm;";
            interpretacja += " min-width:" + dr["w_width_min"] + "mm;";
            interpretacja += " max-width:" + dr["w_width_max"] + "mm;";
            interpretacja += " min-height:" + dr["w_height_min"] + "mm;";
            interpretacja += " max-height:" + dr["w_height_max"] + "mm;";
            interpretacja += " font-weight:" + grubosc_czcionki(dr["w_bold"].ToString()) + ";";
            interpretacja += " border:" + border(dr["w_border"].ToString()) + " solid black;";
            interpretacja += " overflow:" + overflow(dr["w_overflow"].ToString()) + ";";
            interpretacja +="\">";
            interpretacja += dr["w_zawartosc"]; 
            return interpretacja;
        }
1

Po pierwsze primo konstrukcja w postaci konkatencji stringów poprzez znak + jest fatalnym pomysłem z punktu widzenia wydajności twojej aplikacji, zastanów się czy nie chcesz korzystać z klasy StringBuilder.
Po drugie primo zagnieżdżanie "stringa w stringu" jest również błędnym myślowo pojęciem ponieważ klasa String implementuje interfejs Immutable, (fakt powiązany z problemem powyżej): zródło potwierdzające: http://msdn.microsoft.com/en-us/library/vstudio/362314fe.aspx
Po trzecie primo zastanów się czy twojego problemu nie rozwiąże dodatkowa klasa, która opakuje twój string, a która będzie zawierać pola { Id, IdRodzica, Tresc }, i dopisanie odpowiedniego managera, który z kolekcji takich obiektów zbuduje twój dokument html.

I tak, zapoznanie się z wzorcem projektowym kompozyt powinno pomóc w rozwiązaniu problemu.

0
Xiuthechutli napisał(a):

Po pierwsze primo konstrukcja w postaci konkatencji stringów poprzez znak + jest fatalnym pomysłem z punktu widzenia wydajności twojej aplikacji, zastanów się czy nie chcesz korzystać z klasy StringBuilder.

Hmm niestety mnie tego w szkole nie uczyli;) ale dziękuje za rade ^^ Zastosowałem się do instrukcji;)

Xiuthechutli napisał(a):

Po drugie primo zagnieżdżanie "stringa w stringu" jest również błędnym myślowo pojęciem ponieważ klasa String implementuje interfejs Immutable, (fakt powiązany z problemem powyżej): zródło potwierdzające: http://msdn.microsoft.com/en-us/library/vstudio/362314fe.aspx

Może i jest błędem myślowym, jednak wynika z założeń dotyczących tego projektu. Niestety innego pomysłu na rozwiązanie tego zadania, nie mam.

Xiuthechutli napisał(a):

Po trzecie primo zastanów się czy twojego problemu nie rozwiąże dodatkowa klasa, która opakuje twój string, a która będzie zawierać pola { Id, IdRodzica, Tresc }, i dopisanie odpowiedniego managera, który z kolekcji takich obiektów zbuduje twój dokument html.
I tak, zapoznanie się z wzorcem projektowym kompozyt powinno pomóc w rozwiązaniu problemu.

Pomysł jak najbardziej trafiony, jednak kolejna klasa w projekcie nie jest chyba potrzebna, ponieważ efekt działania jest taki sam, musi zwrócić string.
A co do kolekcji to nie wiem jak ją ugryźć... ponieważ przy niej natrafię na ten sam problem.

1

Nie bój się dodać klasy do projektu jeśli jej potrzebujesz, lepiej mieć 5 uporządkowanych klas w małym projekcie, które będą miały dokładnie jedno zadanie do realizacji niż mieć jednego potwora na 1000 linii kodu.
Co do kolekcji (List<T> powinno Ci wystarczyć) sprawa też nie jest nie wiadomo jak skomplikowana, a jak robisz projekt, który potem będzie ktoś oceniał to kod będzie z pewnością sprawiał wrażenie czytelniejszego.

Listę wykorzystasz tylko do przetrzymywania w niej iteracji swoich obiektów {Id, IdRodzica, Tresc} , dodanie, a potem iteracja po elementach listy, która pozwoli zbudować string wyjściowy.

1
juniorchat napisał(a):

Pomysł jak najbardziej trafiony, jednak kolejna klasa w projekcie nie jest chyba potrzebna, ponieważ efekt działania jest taki sam, musi zwrócić string.

Efekt ten sam, pytanie tylko czy chcesz go osiągnąć większym czy mniejszym nakładem pracy, i czy chcesz czytelnego kodu aplikacji czy nie?

Jeśli wczytasz dane z bazy do grafu obiektów, z których każdy będzie potrafił przetworzyć na string siebie i swoje podobiekty, to wszystko Ci się automagicznie złoży w wynik, jakiego oczekujesz. Jeśli zaś będziesz się bawił w przeszukiwanie i wklejanie stringów na podstawie jakiejś płaskiej struktury, to zapewne będziesz miał z tym więcej roboty.

0

Ok, udało się zamierzony efekt osiągnąć, może się kiedyś komuś przyda:
(wskazane również konstruktywne komentarze dot jakości kodu - co by zmienić;)

private string tworzenie_indexu(int number)
        {
            DataTable dt = new DataTable();
            dt = conn_date.polaczenie_dt("Select * from labe_wzorzec_dane where w_id_wzorca ='"+number.ToString()+"' ");
            string wynik ="";
            wynik = wynik_przeszukiwarki("0",dt); 
            return wynik;
        }

        private string wynik_przeszukiwarki(string p, DataTable dt)
        {
            //string wynikowy ="";
            StringBuilder wynikowy = new StringBuilder();
            if (p != "0")
            {
                DataRow[] dr = dt.Select("w_id=" + p);
                wynikowy.Append(interpretacja(dr[0]));
            }
            else
            {
                wynikowy.Append("<html>");
            }
            DataView view = new DataView(dt);
            view.RowFilter = "w_in="+p;
            dataGridView2.DataSource = view.ToTable();
            
            if (view != null)
            {
                foreach (DataRow dr in view.ToTable().Rows)
                {
                    wynikowy.Append(wynik_przeszukiwarki(dr["w_id"].ToString(), dt));
                }
            }
            else
            {
                if (p != "0")
                {
                    wynikowy.Append("</div>");
                }
                else
                {
                    wynikowy.Append("</html>");
                }
            }
            return wynikowy.ToString();
        }

        

        private string interpretacja(DataRow dr )
        {
            //string interpretacja ="";
            StringBuilder sb = new StringBuilder();
            sb.Append("<div id =\"" + dr["w_nazwa"] + "\" ");
            sb.Append("style=\"position:" + wybor_pozycji(dr["w_position"]) + ";");
            sb.Append(" float:" + float_jakie(dr["w_float"].ToString()) + ";");
            sb.Append(" top:" + dr["w_x"] + "mm;");
            sb.Append(" left:" + dr["w_y"] + "mm;");
            sb.Append(" min-width:" + dr["w_width_min"] + "mm;");
            sb.Append(" max-width:" + dr["w_width_max"] + "mm;");
            sb.Append(" min-height:" + dr["w_height_min"] + "mm;");
            sb.Append(" max-height:" + dr["w_height_max"] + "mm;");
            sb.Append(" font-weight:" + grubosc_czcionki(dr["w_bold"].ToString()) + ";");
            sb.Append(" border:" + border(dr["w_border"].ToString()) + " solid black;");
            sb.Append(" overflow:" + overflow(dr["w_overflow"].ToString()) + ";");
            sb.Append("\">");
            sb.Append(dr["w_zawartosc"]); 
            return sb.ToString();
        }

2

@juniorchat, StringBuilder ma metodę AppendFormat, więc np. zamiast:

sb.Append(" font-weight:" + grubosc_czcionki(dr["w_bold"].ToString()) + ";");

lepiej napisać:

sb.AppendFormat(" font-weight:{0};", grubosc_czcionki(dr["w_bold"].ToString()));

1 użytkowników online, w tym zalogowanych: 0, gości: 1