2009-03-31 3 views
1

Ich habe dieses ausgezeichnete Multi-column list article, sowie this question on SO gelesen. Ich bin zu dem Schluss gekommen, dass es keine Cross-Browser-Möglichkeit gibt, um eine lange ungeordnete Liste in n Spalten gleicher Länge zu drehen. Bisher habe ich so zu mehreren-ul-Lösungen reduziert:Was ist der beste Weg, um Inhalte zwischen n Spalten zu teilen?

//Three columns. 
string col1 = string.Empty; 
string col2 = string.Empty; 
string col3 = string.Empty; 
int currItem = 0; 
int collectionCount = myItemCollection.Count; 

foreach item in myItemCollection { 
    currItem++; 
    if (currItem < collectionCount * .33) 
    { 
    col1 = col1 + item.someProperty 
    } 
    else if (currItem < collectionCount * .67) 
    { 
    col2 = col2 + item.someProperty 
    } 
    else 
    { 
    col3 = col3 + item.someProperty 
    } 
} 

string allColumns = @"<ul>" + col1 + "</ul><ul>" 
         col2 + "</ul><ul>" + col3 + "</ul>"; 

Response.Write(allColumns); 

Gibt es einen einfacheren Weg, um meine Liste in Gruppen von drei zu trennen, oder noch besser, einfach die entsprechenden Schließung zu schreiben/Start-ul-Tags wenn ein Element das letzte Element in einer "dritten" ist?

Antwort

1

Dies ist, wie ich persönlich würde wählen zu implementieren es.

const int numColumns = 3; 
const int numColumns = 3; 
var columnLength = (int)Math.Ceiling((double)myItemCollection.Count/3); 

for (int i = 0; i < myItemCollection.Count; i++) 
{ 
    if (i % columnLength == 0) 
    { 
     if (i > 0) 
      Response.Write("</ul>"); 
     Response.Write("<ul>"); 
    } 
    Response.Write(myItemCollection[i].SomeProperty); 
} 

if (i % columnLength == 0) 
    Response.Write("</ul>"); 

Sie String-Verkettung ganz vermeiden (es gibt wirklich keine Notwendigkeit, wenn Sie nur in einen Stream zu schreiben, und wenn Sie nicht waren Sie würden wollen StringBuilder XSE) sowie die fiesen Gleitkommaoperationen die kann bei langen Listen möglicherweise Ungenauigkeiten verursachen (zumindest sind sie unnötig).

Wie auch immer, die Hoffnung, die hilft ...

+0

Ausgezeichnet. Mit einigem Aufräumen funktionierte dieser Code absolut einwandfrei. Genau das, was ich mir erhofft hatte. –

+0

Ich bin froh, dass es den Trick für Sie gemacht hat ... (Lassen Sie es mich auch wissen, wenn es irgendwelche Fehler enthält, damit ich es bearbeiten kann, ansonsten nehme ich an, dass Sie nur kleine Änderungen für Ihre spezifischen Zwecke vorgenommen haben.) – Noldorin

0

Wenn es sich um eine ungeordnete Liste ist, können Sie einfach schweben die <li> links und geben ihm eine Breite von etwas weniger als (100/n)%

1

Das ist zu spät, aber Response.Write wird ausgegeben in einem unvorhersehbaren Ort, wahrscheinlich vor alle anderen Ausgang.

Der „richtige“ Code sollte Kontrollen auf create, Page_Load oder an jedem anderen Ort bauen:

List<string> items = new List<string>() { "aaa", "bbb", "ccc", "ddd", "eee" }; 
int colSize = (int)Math.Ceiling(items.Count/3.0); 

HtmlGenericControl ul = null; 
for (int i = 0; i < items.Count; i++) 
{ 
    if (i % colSize == 0) 
    { 
     ul = new HtmlGenericControl("ul"); 
     Page.Form.Controls.Add(ul); 
    } 

    HtmlGenericControl li = new HtmlGenericControl("li"); 
    li.InnerText = items[i]; 
    ul.Controls.Add(li); 
} 

Auf diese Weise brauchen Sie nicht besorgt über Rendering und Öffnungs Tracking/Schließ-Tags.

Verwandte Themen