2009-03-31 3 views
1

私はこの優れたMulti-column list articlethis question on SOを読んでいます。私は、長い順序のないリストを同じ長さのnの列にするブラウザ間の方法はないという結論に達しました。これまでのところ、私はこのような複数の-ULソリューションに縮小されています:n個の列間でコンテンツを分割する最も良い方法は何ですか?

//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); 

は単に/ ULタグの開始適切な閉鎖を書くために、まだ3、またはそれ以上のグループに私のリストを分離するための簡単な方法はあります要素が「3番目」の最後の項目の場合それは順不同リストである場合

答えて

1

それ。

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>"); 

あなたは(そこにあなただけのストリームに書き込みをしている必要が本当にいない、とあなたがいなかった場合は、StringBuilderをXSEにしたいと思います)、それらの厄介な浮動小数点演算だけでなく、完全に文字列連結を回避しています長いリストの不正確さを引き起こす可能性があります(少なくとも、不必要なものです)。とにかく

、これは遅すぎるが、Response.Writeをは最も可能性の高い先に他のすべての出力の予測不可能な場所での出力、意志...

+0

優れています。マイナークリーンナップでは、このコードは完全に完璧に機能しました。まさに私が望んでいたもの。 –

+0

嬉しいことに、あなたのためにトリックをしました...(また、バグがあるので、私はそれを編集することができます。そうでなければ、自分の用途に合わせて少し修正したと仮定します)。 – Noldorin

0

、あなただけ<李>左を浮遊し、それを少しの幅を与えることができます(100/N)%未満これは私が個人的に実装することを選択する方法をある

1

に役立ちます願っています。

「適切な」コードがCreateChildren、Page_Loadのか、他の場所でのコントロールを構築する必要があります。

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); 
} 

あなたがタグを閉じ/レンダリングと開口部の追跡を心配する必要はありませんこの方法です。

関連する問題