如何在数据列表asp.net列中创建字母顺序

时间:2009-05-13 23:41:20

标签: c# asp.net gridview

我尝试创建一个数据列表,按列字母顺序显示所有菜肴但是我找不到方法,可以任何人帮忙。

在asp.net中使用数据列表或转发器只允许您以水平或垂直字母顺序显示,例如

Afghan       Asian       Burmese     Cambodian
Chinese     Croatian    European    French
Greek            Indian     International   Italian

我想拥有的是

Afghan      Chinese      Greek
Asian       Croatian     Indian 
Burmese     European     International 
Cambodian   French       Italian

谢谢

3 个答案:

答案 0 :(得分:1)

nickf的回答帮助我找到了以下方法,该方法将根据需要转换列表:

public static List<T> ReorderListIntoColumns<T>(List<T> list, int totalColumns)
    {
        List<T> reordered = new List<T>();
        int itemsPerColumn = (int) list.Count / totalColumns;

        for (int i = 0; i < itemsPerColumn; i++)
        {
            for (int j = 0; j < totalColumns; j++)
            {
                reordered.Add(list[(j * itemsPerColumn) + i]);
            }
        }

        return reordered;
    }

即使没有接受的答案,这个主题也似乎获得了很多观点。希望这会帮助其他人,这需要以这种方式重新排序列表!

答案 1 :(得分:0)

我要做的是按字母顺序获取列表,然后重新排列,以便在使用datalist / repeater默认排序时,它采用您想要的格式。

奇怪的伪代码。

/*
your input is A,B,C,D,E,F,G,H,I,J,K,L

given this order, it returns:

A, B, C
D, E, F
G, H, I
J, K, L

but you want

A, E, I
B, F, J
C, G, K
D, H, L

So you need to change your input to this:

A,E,I,B,F,J,C,G,K,D,H,L

*/

let numColumns = 3;
let numItems = 12;
let itemsPerColumn = numItems / numColumns;

loop i from 0 to itemsPerColumn - 1
    loop j from 0 to numColumns - 1
        newOrdering.push(oldOrdering[i * numColumns + j])

可能有一些漂亮的.NET功能可以改变排序方式,但这只是一种老式的方法。

PS:这是在最好的情况下工作,即项目数量可以被列数整除。你必须对不同的值进行一些调整。

答案 2 :(得分:0)

我最近使用PlaceHolder和自定义表格完成了此操作:

<asp:PlaceHolder ID="locationTablePlaceHolder" runat="server"/>

然后在支持代码中:

DataView view  = locations.Tables[0].DefaultView;
view.Sort      = "locationName";

Table table = new Table();
locationTablePlaceHolder.Controls.Clear();
locationTablePlaceHolder.Controls.Add(table);

// enumerator to loop through all items in the DataView
IEnumerator enumerator = view.GetEnumerator();
enumerator.Reset();

// first create all the row objects since we want to populate
// column by column.
int rowCount = 5;
int colCount = 5;
for (int i = 0; i < rowCount; i++)
{
    TableRow row = new TableRow();
    table.Rows.Add(row);
}

// then loop through each column taking items from the enumerator
// to populate the table
for (int j = 0; j < colCount; j++)
{
    for (int i = 0; i < rowCount; i++)
    {
        TableCell cell = new TableCell();
        if (enumerator.MoveNext())
        {
            Label label = new Label();
            label.Text = (String)((DataRowView)enumerator.Current).Row["locationName"];
            cell.Controls.Add(label);
            table.Rows[i].Cells.Add(cell);
        }
    }
}