如何在WPF中动态更改GridView列的顺序?

时间:2009-03-31 14:18:30

标签: c# .net asp.net

我有两个radiobuttons。 如果我点击第一个单选按钮,我希望列的顺序为:

  • ASSETNAME
  • 资产
  • 类型名
  • Iprisklevel

如果我点击第二个单选按钮,我希望列的顺序为:

  • AssetName
  • 资产
  • 类型名
  • Iprisklevel

以下是我的XAML示例:

<asp:GridView ID="dgAssets" runat="server" AutoGenerateColumns="False" AllowPaging="True"
            DataKeyNames="ID" AllowSorting="True" OnPageIndexChanging="dgAssets_PageIndexChanging"
            Width="100%" OnRowCommand="dgAssets_RowCommand" OnRowDataBound="dgAssets_RowDataBound"
            OnSorting="dgAssets_Sorting">
            <Columns>

                <asp:TemplateField Visible="False">
                    <ItemTemplate>
                        <%# DataBinder.Eval(Container.DataItem, "ID")%>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField SortExpression="ASSETNAME">
                    <ItemTemplate>
                        <%# DataBinder.Eval(Container.DataItem, "ASSETNAME")%>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField SortExpression="ASSET">
                    <ItemTemplate>
                        <%# DataBinder.Eval(Container.DataItem, "ASSET")%>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField SortExpression="GROUPS">
                    <ItemTemplate>
                        <%# DataBinder.Eval(Container.DataItem, "GROUPS")%>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField SortExpression="TYPENAME">
                    <ItemTemplate>
                        <%# DataBinder.Eval(Container.DataItem, "TYPENAME")%>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField SortExpression="IPRISKLEVEL">
                    <ItemTemplate>
                        <%# DataBinder.Eval(Container.DataItem, "IPRISKLEVEL")%>
                    </ItemTemplate>
                </asp:TemplateField>

            </Columns>
        </asp:GridView>

3 个答案:

答案 0 :(得分:2)

不是在设计模式下添加列,而是使用C#代码动态添加它们。这将允许您以任何方式订购它们。

动态添加列的代码:

DataTable dt = yourDataTable;
foreach (DataColumn col in dt.Columns)
{
    BoundField bfield = new BoundField();
    bfield.DataField = col.ColumnName;
    bfield.HeaderText = col.ColumnName;
    dgAssets.Columns.Add(bfield);
}

答案 1 :(得分:1)

如果您只想单击单选按钮,请使用DataView.Sort方法,例如

dataView.Sort = "AssetName, Asset, Groups, TypeName, Iprisklevel";

然后在第二个单选按钮上单击“

dataView.Sort = "Groups, AssetName, Asset, TypeName, Iprisklevel";

答案 2 :(得分:0)

您必须动态添加列。下面是一些示例代码,用于添加依次为数据绑定的列。请注意,此模板是页面类的子类。

此方法使用完全模板化的列。我相信你也可以使用绑定列,这可能会有点简单。全部取决于您在网格视图中通常使用的内容。

未经测试但已从工作代码中删除:

private void AddTemplates()
{
    TemplateField templateField = new TemplateField();
    templateField.HeaderText = entity.ChangeHistoryColumn;
    templateField.ItemTemplate = new GridViewColumnTemplate();
    GridViewMain.Columns.Add(templateField);
}

public class GridViewColumnTemplate : ITemplate
{
    public GridViewColumnTemplate() { }

    public void InstantiateIn(Control container)
    {
        Label label = new Label();
        label.DataBinding += delegate(object sender, EventArgs e)
        {
            GridViewRow row = (GridViewRow)label.NamingContainer;

            int headerID = (int)DataBinder.Eval(row.DataItem, "HeaderID");
            ((Label)sender).Text = headerID.ToString();
        };

        container.Controls.Add(label);
    }
}