【问题标题】:Filtering Data on a DevExpress GridView在 DevExpress GridView 上过滤数据
【发布时间】:2014-01-21 13:01:18
【问题描述】:

我是一名 MVC 人员,对 WebForms 的经验很少,但现在我不得不向旧的 VB.NET WebForms 应用程序添加一些功能。

所以该应用程序正在使用 DevExpress Grids,它会在页面上显示一个非常长的网格视图,其中一列具有以下内容:

我被要求添加的额外功能是用户可以说的过滤器:

我只想查看选择的加载单选按钮为打印(或其他两个操作之一)的行。

所以我去了网格的底部并创建了以下内容:

我的想法是,用户可以来到这个下拉菜单并选择他或她想要过滤的单选按钮操作。

DevExpress GridView 代码

<dx:ASPxGridView ID="GridView1" runat="server" Theme="Office2010Blue" KeyFieldName="ID" AutoGenerateColumns="False" DataSourceID="ObjectDataSource1" Width="3200px">
    <Columns>
        <!-- Many more columns go here -->
        <dx:GridViewDataColumn Caption="" VisibleIndex="29" Name="decision" Width="150px">
            <HeaderTemplate>
                <asp:LinkButton runat="server" ID="lnkPrint" OnClick="SelectPrintAll">Print All</asp:LinkButton>
                <asp:LinkButton runat="server" ID="lnkEmail" OnClick="SelectEmailAll">Email All</asp:LinkButton>
                <asp:LinkButton runat="server" ID="lnkIgnore" OnClick="SelectIgnoreAll">Ignore All</asp:LinkButton>
            </HeaderTemplate>

            <DataItemTemplate>
                <asp:UpdatePanel runat="server" ID="upRadDecision" UpdateMode="Conditional">
                    <ContentTemplate>
                        <dx:ASPxRadioButtonList ID="radDecision" runat="server" RepeatDirection="Horizontal"
                            OnSelectedIndexChanged="StoreDecisionForRow" AutoPostBack="True" Height="15px"
                            OnDataBinding="BindDecisionRadioButton">
                            <Border BorderStyle="None"></Border>
                            <Paddings Padding="0"></Paddings>
                            <Items>
                                <dx:ListEditItem Text="Print" Value="Print" />
                                <dx:ListEditItem Text="Email" Value="Email" />
                                <dx:ListEditItem Text="Ignore" Value="Ignore" />
                            </Items>
                        </dx:ASPxRadioButtonList>
                    </ContentTemplate>
                </asp:UpdatePanel>
            </DataItemTemplate>
            <Settings HeaderFilterMode="CheckedList"></Settings>
        </dx:GridViewDataColumn>
    </Columns>

    <!-- Stylres -->
    <Styles>
        <AlternatingRow Enabled="true" />
    </Styles>

    <!-- Settings -->
    <Settings ShowFilterRow="True" ShowFilterRowMenu="true" ShowFilterBar="Auto" ShowHeaderFilterButton="true" ShowGroupPanel="True" ShowFooter="True" />
    <SettingsBehavior AllowSelectByRowClick="False" />
    <SettingsBehavior AllowSelectSingleRowOnly="False" />
    <SettingsBehavior ProcessSelectionChangedOnServer="true" />
    <SettingsPager Mode="ShowAllRecords" />

    <GroupSummary>
        <dx:ASPxSummaryItem SummaryType="Count" />
    </GroupSummary>
</dx:ASPxGridView>

我在我的过滤按钮中添加了一个点击处理程序,代码是这样的:

Private Sub btnFilterDefaults_Click(sender As Object, e As EventArgs) Handles btnFilterDefaults.Click
    Dim filterOn As String = ddDefaultsFilterOption.SelectedValue
    'Code Handling the Filtering.
    GridView1.filter
    For rowIndex As Integer = 0 To GridView1.VisibleRowCount - 1
        Dim datarow = GridView1.GetDataRow(rowIndex)
        Dim radDecision As ASPxRadioButtonList = CType(GridView1.FindRowCellTemplateControl(rowIndex, Nothing, "radDecision"), ASPxRadioButtonList)
        Dim decision As String = ""

        If radDecision.Value Is Nothing then Continue For

        decision = radDecision.Value.ToString()

        If decision.Contains(filterOn) Then
            datarow.?? <<<<< no option to hide row here!!! :/
        End If
    Next
End Sub

我希望当我拿到数据行时,我可以隐藏它,但是没有这个选项!

【问题讨论】:

    标签: vb.net gridview webforms devexpress


    【解决方案1】:

    我认为问题在于您正在尝试将可见特征应用于数据行。你想要做的是使用 GridViewRow 代替。它是演示对象。对不起,我没有给你一个例子,但here 是一个指向 msdn 的链接

    【讨论】:

    • 很有趣,但是当我访问我的网格(dev express)时,没有.GetGridViewRow()
    【解决方案2】:

    您是否尝试将HeaderFilterMode 用于您的GridView?我记得这个功能从 12 DevExpress 版本开始。请看下面的示例,如何启用它。

        <dx:GridViewDataColumn Caption="" VisibleIndex="29" Name="decision" Width="150px">
           ...
           <Settings HeaderFilterMode="CheckedList" />
       </dx:GridViewDataColumn>
    

    如果您有旧版本或完全需要其他功能,您可以为过滤列创建自己的自定义模板。看下面c#上的例子

    public class FilterLookupTemplate : ITemplate
    {
        private const string FormatFilterValue = "FilterLookupTemplateValue_{0}";
    
        public string ClientIdLookup { get; private set; }
        public string FieldName { get; set; }
        public string DataSourceID { get; set; }
        public ASPxGridView GridView { get; set; }
    
        #region ITemplate Members
    
        /// <summary>
        /// Initialization template
        /// </summary>
        public void Init()
        {
            (GridView != null).Ensure<ArgumentException>("There didn't passed reference to grid view!");
            if (!GridView.IsClientSideAPIEnabled() || String.IsNullOrEmpty(GridView.ClientInstanceName))
            {
                GridView.ClientInstanceName = GridView.ID;
            }
    
            var column = GridView.Columns[FieldName] as GridViewDataColumn;
            (column != null).Ensure<ArgumentException>("There is error to get column by name!");
            column.Settings.ShowFilterRowMenu = DefaultBoolean.False;
            GridView.AutoFilterCellEditorCreate += OnAutoFilterCellEditorCreate;
            GridView.AutoFilterCellEditorInitialize += OnAutoFilterCellEditorInitialize;
            GridView.ProcessColumnAutoFilter += OnProcessColumnAutoFilter;
        }
    
        /// <summary>
        /// Creating filter dropdown control
        /// </summary>
        /// <param name="sender">Event sender</param>
        /// <param name="e">Event arguments</param>
        private void OnAutoFilterCellEditorCreate(object sender, ASPxGridViewEditorCreateEventArgs e)
        {
            if (e.Column.FieldName.Equals(FieldName))
            {
                var dde = new DropDownEditProperties { EnableClientSideAPI = true, DropDownWindowTemplate = this };
                e.EditorProperties = dde;
            }
        }
    
        /// <summary>
        /// Initializing filter dropdown control
        /// </summary>
        /// <param name="sender">Event sender</param>
        /// <param name="e">Event arguments</param>
        private void OnAutoFilterCellEditorInitialize(object sender, ASPxGridViewEditorEventArgs e)
        {
            if (e.Column.FieldName.Equals(FieldName))
            {
                var editor = e.Editor as ASPxDropDownEdit;
                (editor != null).Ensure<ArgumentException>("There wasn't passed reference to the drop down editor!");
                editor.ReadOnly = true
            }
        }
    
        /// <summary>
        /// Processing column filtering
        /// </summary>
        /// <param name="sender">Event sender</param>
        /// <param name="e">Event arguments</param>
        private void OnProcessColumnAutoFilter(object sender, ASPxGridViewAutoFilterEventArgs e)
        {
            var session = GridView.Page.Session;
            if (e.Kind == GridViewAutoFilterEventKind.CreateCriteria)
            {
                session[String.Format(FormatFilterValue, e.Column.FieldName)] = e.Value;
                if (e.Column.FieldName.Equals(FieldName) && !String.IsNullOrEmpty(e.Value))
                {
                    var values = e.Value.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries);
                    if (values.Length > 0)
                    {
                        var action = new Func<string, string, FunctionOperator>((name, value) =>
                                  new FunctionOperator(FunctionOperatorType.Contains, new OperandProperty(name), new OperandValue(value)));
                        if (values.Length > 1)
                        {
                            var group = new GroupOperator(GroupOperatorType.Or);
                            group.Operands.AddRange(values.Select(v => action(e.Column.FieldName, v)).ToArray());
                            e.Criteria = group;
                        }
                        else
                        {
                            e.Criteria = action(e.Column.FieldName, values[0]);
                        }
                    }
                }
            }
            else
            {
                if (session[String.Format(FormatFilterValue, e.Column.FieldName)] != null)
                {
                    e.Value = session[String.Format(FormatFilterValue, e.Column.FieldName)].ToString();
                }
            }
        }
    
        /// <summary>
        /// Rendering loolup template controls
        /// </summary>
        /// <param name="container">Container of date range template</param>
        public void InstantiateIn(Control container)
        {
            (GridView != null).Ensure<ArgumentException>("There didn't passed reference to grid view!");
            var table = new Table { Width = new Unit(200, UnitType.Pixel) };
            container.Controls.Add(table);
    
            var row = new TableRow();
            table.Rows.Add(row);
    
            var cell = new TableCell();
            row.Cells.Add(cell);
    
            var lbl = new ASPxLabel { ID = "lblSelect", Text = MessageResources.FilterLookupTemplate_SelectLabelText };
            cell.Controls.Add(lbl);
    
            cell = new TableCell();
            row.Cells.Add(cell);
            var lookup = new ASPxGridLookup
                             {
                                 ID = GridView.ID + "lookupValues",
                                 EnableClientSideAPI = true,
                                 Width = new Unit(100, UnitType.Percentage),
                                 SelectionMode = GridLookupSelectionMode.Multiple
                             };
            lookup.GridView.Width = new Unit(100, UnitType.Percentage);
            lookup.GridView.DataSourceID = DataSourceID;
            lookup.GridView.KeyFieldName = "id";
            lookup.GridView.Columns.Add(new GridViewCommandColumn { ShowSelectCheckbox = true, AllowDragDrop = DefaultBoolean.False });
            var nameColumn = new GridViewDataTextColumn { FieldName = "name" };
            nameColumn.Settings.AllowDragDrop = DefaultBoolean.False;
            nameColumn.Settings.AllowGroup = DefaultBoolean.False;
            nameColumn.Settings.AllowHeaderFilter = DefaultBoolean.False;
            nameColumn.Settings.AllowSort = DefaultBoolean.False;
            lookup.GridView.Columns.Add(nameColumn);
            lookup.EnableClientSideAPI = true;
            cell.Controls.Add(lookup);
            ClientIdLookup = lookup.ClientID;
            row = new TableRow();
            table.Rows.Add(row);
            cell = new TableCell { ColumnSpan = 2 };
            row.Cells.Add(cell);
    
            var lnk = new ASPxHyperLink { Text = MessageResources.FilterLookupTemplate_ApplyLinkText, NavigateUrl = "#" };
            lnk.ClientSideEvents.Click =
                String.Format("function (s, e) {{ {0}.HideDropDown(); ApplyLookupFilter({0}, {1}, '{2}', {3}); }}",
                              container.NamingContainer.NamingContainer.ClientID,
                              GridView.ClientInstanceName,
                              FieldName,
                              ClientIdLookup);
            cell.Controls.Add(lnk);
            container.Controls.Add(table);
        }
    
        #endregion
    }
    

    然后为您的网格视图注册它。 ReportsCustomerDataSource 是一个 LINQ 数据源控件。

    public partial class YourPage: Page
    {
        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);
            new FilterLookupTemplate { FieldName = "ReportCustomers", DataSourceID = ReportsCustomerDataSource.ID, GridView = _gridView }.Init();
        }
    }
    

    在表单上会是这样的

    【讨论】:

    • 我的列不是标准列,例如 Color 行保存颜色值。
    • 我写了很多非标准列以及颜色列,只需提供您有问题的gridview设置
    • 我已经更新了我的问题,并按照您的要求添加了 GridView 代码。如果您还希望我添加任何其他内容,请告诉我。谢谢
    • 我有 DevExpress v12.1,我试过你的代码(在注释掉我添加的东西之后),但我没有看到任何不同!我看不到过滤功能。我想在哪里看到变化?谢谢
    • 在过滤器行,我在答案中添加了截图
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    相关资源
    最近更新 更多