簡體   English   中英

如何動態更改 WPF 中 GridView 列的順序?

[英]How can I dynamically change the order of my GridView columns in WPF?

我有兩個單選按鈕。 如果我單擊第一個單選按鈕,我希望列的順序為:

  • 資產名稱
  • 資產
  • 團體
  • 類型名稱
  • Iprisklevel

如果我單擊第二個單選按鈕,我希望列的順序為:

  • 團體
  • 資產名稱
  • 資產
  • 類型名稱
  • 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>

與其在設計模式下添加列,不如使用 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);
}

如果您只想對單選按鈕單擊進行排序,請使用 DataView.Sort 方法,例如

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

然后在第二個單選按鈕上單擊執行

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

您必須動態添加列。 下面是一些示例代碼,它們添加了一個反過來數據綁定的列。 請注意,此模板是您的頁面 class 的子 class。

此方法使用完全模板化的列。 我相信您也可以使用可能更簡單的綁定列。 一切都取決於您通常在網格視圖中使用的內容。

未經測試但從工作代碼中刪除:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM