我正在尝试根据Web应用程序的用户需求动态重新排序gridview列。
例如,假设默认表以A B C D ... W X Y Z列开头。
用户打开另一个表但必须具有C D E F ... Y Z A B。
的顺序我目前的实施如下:
<asp:GridView ID="lettertable" ClientIDMode="Static" runat="server" NullDisplayText="" AutoGenerateColumns="False">
<Columns>
<asp:BoundField DataField="A" ReadOnly="false" ItemStyle-CssClass="tlet ssA" />
<asp:BoundField DataField="B" ReadOnly="false" ItemStyle-CssClass="tlet ssB" />
<asp:BoundField DataField="C" ReadOnly="false" ItemStyle-CssClass="tlet ssC" />
<asp:BoundField DataField="D" ReadOnly="false" ItemStyle-CssClass="tlet ssD" />
<asp:BoundField DataField="E" ReadOnly="false" ItemStyle-CssClass="tlet ssE" />
...etc
</Columns>
</asp:GridView>
代码隐藏涉及一组相当广泛的条件(考虑到启动与非启动,相对于不同的记录与不同的记录),如下所示:
if (letchg == 0)
{
for (int i = 1; i < rep; i++)
{
var columnMove = grid.Columns[1];
grid.Columns.RemoveAt(1);
grid.Columns.Insert((26), columnMove);
}
}
if (letchg == 2)
{
for (int i = 1; i < rep; i++)
{
var columnMove = grid.Columns[1];
grid.Columns.RemoveAt(1);
grid.Columns.Insert((26), columnMove);
}
}
if (letchg == -2)
{
for (int i = 1; i < rep; i++)
{
var columnMove = grid.Columns[1];
grid.Columns.RemoveAt(1);
grid.Columns.Insert((26), columnMove);
}
}
}
启动与表之间切换有不同的条件,因为一旦我将列从ABCD ... WXYZ重新排序到CDEF ... YZAB,它就会保持这种状态。因此,如果我想去DEFG ... ZABC,我只移动一列,因为它是相对的。大问题是,如果用户点击刷新按钮(创建回发),它将重新发送最后一个操作,搞砸了整个订单。
在进行重新排序之前,是否可以每次将表格的列顺序重置为ABCD ... WXYZ?这样它不是相对重新排序?或者有更好的方法吗?
答案 0 :(得分:0)
您需要动态添加列。在代码下方使用。
// grid Columns with respect to their data fields
Dictionary<string, DataControlField> gridColumns = new Dictionary<string, DataControlField>();
for (int record = 0; record < lettertable.Columns.Count; record++)
{
var gridColumn = lettertable.Columns[record];
if (gridColumn is BoundField)
{
var boundField = gridColumn as BoundField;
gridColumns.Add(boundField.DataField, gridColumn);
}
}
// columns new arrangement
string columnsOrder = "BAECD";
for(int count= lettertable.Columns.Count-1; count>-1; count--)
{
// remove existig columns
lettertable.Columns.RemoveAt(count);
}
// add columsn
foreach (var columnOrder in columnsOrder)
{
lettertable.Columns.Add(gridColumns[columnOrder.ToString()]);
}
// Bind grid to show new columns
lettertable.DataBind();