c# 使用高级 datagridview (ADGV) 过滤器而不使用 BindingSource

2023-12-01

我正在使用高级 DataGridView (ADGV) 发现here向我的应用程序添加过滤功能。

过滤或排序的代码如下:

private void advancedDataGridView1_SortStringChanged(object sender, EventArgs e)
{
    this.stockHistoryBindingSource.Sort = advancedDataGridView1.SortString;
}

private void advancedDataGridView1_FilterStringChanged(object sender, EventArgs e)
{
    this.stockHistoryBindingSource.Filter = advancedDataGridView1.FilterString;
}

但我无法使用它,因为在我的项目中,我正在读取 XML 文件并使用以下代码将其绑定到我的 ADGV:

void QueryFoos()
{
    IEnumerable<FooViewData> query =
        from foo in XmlFiles.FOO.Root.Descendants("foo")
        select new FooViewData
        {
            ID = Convert.ToInt32(foo.Attribute("id").Value),
            Num = Convert.ToInt32(foo.Attribute("num").Value),
            ...
        };

    advancedDataGridView1.DataSource = query.OrderBy(n => n.ID).ThenBy(r => r.Num).ToList();
}

我尝试了这样的代码,但我并不惊讶它在我脸上抛出异常:

BindingSource x = (BindingSource)this.advancedDataGridView1.DataSource;
x.Filter = advancedDataGridView1.FilterString;
this.advancedDataGridView1.DataSource = x;

是否有一些解决办法可以使用 ADGV 的过滤和排序?


事实证明我今天也遇到了同样的问题并正在寻找解决方案。基本上,问题在于 ADGV 是为与数据表一起使用而编写的,而不是与对象列表一起使用。

这个解决方案对我有用,但您的里程可能会有所不同。

我最终做的是使用动态链接自己对对象列表执行过滤。黑客部分是我转换 ADGV 生成的过滤字符串并将其转换为动态 linq 期望的字符串。

我们从一些数据开始。我有一个名为 DataPointGridViewModel 的类,如下所示:

public class DataPointGridViewModel 
{
    public int DataPointId { get; set; }
    public string Description { get; set; }
    public bool InAlarm { get; set; }
    public DateTime LastUpdate { get; set; }
    public double ScalingMultiplier { get; set; }
    public decimal Price { get; set; }
}

数据可以是任何东西。这是您将在网格中过滤的数据。显然您将拥有自己的数据类。您需要用您自己的模型/数据对象替换此 DataPointGridViewModel 类。

现在,这是您需要添加的代码示例代码。我还在 github 上找到了一个示例项目:我在 github 上有此代码的工作版本:here

这是您需要添加的代码:

List<DataPointGridViewModel> m_dataGridBindingList = null;
List<DataPointGridViewModel> m_filteredList = null;

private void dataGridView2_FilterStringChanged(object sender, Zuby.ADGV.AdvancedDataGridView.FilterEventArgs e)
{
    try
    {
        if ( string.IsNullOrEmpty(dataGridView2.FilterString) == true )
        {
            m_filteredList = m_dataGridBindingList;
            dataGridView2.DataSource = m_dataGridBindingList;
        }
        else
        {
            var listfilter = FilterStringconverter(dataGridView2.FilterString);

            m_filteredList = m_filteredList.Where(listfilter).ToList();

            dataGridView2.DataSource = m_filteredList;
        }
    }
    catch (Exception ex)
    {
        Log.Error(ex, MethodBase.GetCurrentMethod().Name);
    }
}

这是将 ADGV 过滤器字符串转换为 Dynamic Linq 过滤器字符串的函数:

private string FilterStringconverter(string filter)
{
    string newColFilter = "";

    // get rid of all the parenthesis 
    filter = filter.Replace("(", "").Replace(")", "");

    // now split the string on the 'and' (each grid column)
    var colFilterList = filter.Split(new string[] { "AND" }, StringSplitOptions.None);

    string andOperator = "";

    foreach (var colFilter in colFilterList)
    {
        newColFilter += andOperator;

        // split string on the 'in'
        var temp1 = colFilter.Trim().Split(new string[] { "IN" }, StringSplitOptions.None);

        // get string between square brackets
        var colName = temp1[0].Split('[', ']')[1].Trim();

        // prepare beginning of linq statement
        newColFilter += string.Format("({0} != null && (", colName);

        string orOperator = "";

        var filterValsList = temp1[1].Split(',');

        foreach (var filterVal in filterValsList)
        {
            // remove any single quotes before testing if filter is a num or not
            var cleanFilterVal = filterVal.Replace("'", "").Trim();

            double tempNum = 0;
            if (Double.TryParse(cleanFilterVal, out tempNum))
                newColFilter += string.Format("{0} {1} = {2}", orOperator, colName, cleanFilterVal.Trim());
            else
                newColFilter += string.Format("{0} {1}.Contains('{2}')", orOperator, colName, cleanFilterVal.Trim());

            orOperator = " OR ";
        }

        newColFilter += "))";

        andOperator = " AND ";
    }

    // replace all single quotes with double quotes
    return newColFilter.Replace("'", "\"");
}

...最后排序函数如下所示:

private void dataGridView2_SortStringChanged(object sender, Zuby.ADGV.AdvancedDataGridView.SortEventArgs e) 
{
    try
    {
        if (string.IsNullOrEmpty(dataGridView2.SortString) == true)
            return;

        var sortStr = dataGridView2.SortString.Replace("[", "").Replace("]", "");

        if (string.IsNullOrEmpty(dataGridView2.FilterString) == true)
        {
            // the grid is not filtered!
            m_dataGridBindingList = m_dataGridBindingList.OrderBy(sortStr).ToList();
            dataGridView2.DataSource = m_dataGridBindingList;                    
        }
        else
        {
            // the grid is filtered!
            m_filteredList = m_filteredList.OrderBy(sortStr).ToList();
            dataGridView2.DataSource = m_filteredList;
        }
    }
    catch (Exception ex)
    {
        Log.Error(ex, MethodBase.GetCurrentMethod().Name);
    }
}

最后,您将需要 Dynamic Linq 库here

您可以使用 Nuget 将其引入您的项目中:

Install-Package System.Linq.Dynamic
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c# 使用高级 datagridview (ADGV) 过滤器而不使用 BindingSource 的相关文章

随机推荐

  • 如何将 String^ 转换为 char 数组 [重复]

    这个问题在这里已经有答案了 可能的重复 需要将 String 转换为 char 我一直在寻找这个解决方案 但我找不到任何具体的东西 我在 Visual Studio C Windows 窗体应用程序中工作 我需要转换String 值存入 c
  • 给定 DataTable 时 Google Charts draw() 方法类型错误

    我试图使用 HTML 和 Javascript 在 Google Charts 中显示带有范围过滤器的折线图 但是每当我运行draw 函数 代码告诉我我使用了错误的数据类型draw 参数 它应该是一个DataTable 然而 我使用构建我的
  • 当管道中的一个进程失败时退出

    目标是制作一个简单的非侵入式包装器 将 stdin 和 stdout 跟踪到 stderr bin bash tee dev stderr script sh tee dev stderr exit PIPESTATUS 1 测试脚本scr
  • Zurb 基金会 SASS 变量

    我正在使用 Zurb 的 Foundation 框架 我想知道如何编辑 SASS 变量的默认值 我在互联网上进行了搜索 但找不到任何可以帮助我的东西 请检查本文档在他们的网站上 Under Available SCSS Variables部
  • Python 3.8 不加载 C dll

    升级到 Python 3 8 1 后 我的工作代码崩溃了 以下行曾经有效 但现在返回错误消息 cdll LoadLibrary mydllpath mydll dll gt Could not find module mydll dll T
  • 在其他 PHP 类中使用 PDO 数据库类

    我有一个使用 PDO 的数据库类 这是它的一部分示例 class db private host private username private password private con private pdo public functi
  • Jquery 选择器:如何:更改链接悬停时图像标记的 src 属性

    当链接悬停时 我需要更改图像的 src 属性 div class clear span 33 last div class hicon span 1 a href title Homepage img src Assets images h
  • 为什么受保护的继承会导致dynamic_cast失败?

    我将 C 基类更改为protected继承和我的dynamic cast s 停止工作 为什么要改变继承protected改变的行为dynamic cast struct Base static Base lookupDerived Act
  • 需要用Java编写一个RESTful JSON服务

    这是我的要求 我在 mysql 中有一个简单的表 考虑任何带有几个字段的表 我需要用 Java 编写一个简单的 RESTFUL JSON Web 服务 用于对此表执行 CRUD 操作 我尝试在网上搜索一些全面的示例 但找不到任何示例 有人可
  • 如何测试SSIS包?

    如何测试SSIS包 测试时应注意哪些事项 ssis 包 测试时应该编写哪些测试用例步骤 ssisUnit是一个用于对 SSIS 包进行单元测试的出色工具 我遇到的唯一警告是您需要在安装了 SSIS 服务器组件的计算机上运行单元测试 我在一家
  • 如何在 PHP 中删除十进制数的最后一位数字

    我想在 PHP 中删除十进制数的最后一位数字 假设我有 14 153 我希望它是 14 15 我将执行此步骤 直到我的数字不再是小数 我认为这应该有效
  • 如何对 QPlainTextEdit 进行分页?

    我一直在使用 QPlainTextEdit 在我们的应用程序中编辑文本 最近我们决定需要以分页格式显示文本 而不是一致的文本块 经过大量研究 我意识到虽然 QPlainTextEdit 没有任何页面或分页知识 但 QPlainTextDoc
  • 使用服务帐户的 YouTube 报告 API

    按照 Google 的文档 您应该能够使用 YouTube Reporting API 而无需使用服务帐户进行用户身份验证 目前我有一个非常简单的示例 它应该为我提供可用工作的列表 但也可能为空 但我的 403 权限被拒绝 Request
  • 如何以编程方式添加 UINavigationBar 及其上的后退按钮

    我是新手 尝试制作一个类似于 iPhone 的 Notes 应用程序UITextView 我正在得到textView和线路并且工作正常 我的问题是我想添加一个UINavigationBar和其上的后退按钮 我想添加一个UIToolBar底部
  • 如何比较 php/mysql 中的日期和时间

    我需要比较 php mysql 中的日期和时间基本上我有一个应用程序和一个服务器应用程序需要连接到服务器以检查数据库中的新条目 服务器从应用程序接收日期时间作为字符串 这是在此处完成的 SimpleDateFormat dateformat
  • C99 可变长度数组最大大小和 sizeof 函数

    我正在尝试在我的 C 代码中使用可变长度数组 VLA 并试图加深对它们应该做什么和不应该做什么的理解 我的函数中有以下片段 void get pdw frame usb pdws t pdw frame pdw io t pdw io un
  • powershell get-childitem 到 csv 并包含详细信息

    我正在尝试为具有深层文件夹结构的文件共享创建 CSV 文件 我希望 CSV 看起来像 filename filepath file type folderStructure 到目前为止我有以下内容 Get ChildItem Path D
  • 具有多重继承的消息映射 MFC:如何避免警告 C4407 和运行时崩溃

    我最近将一个项目从 VS2008 移植到 VS2013 并遇到了一些堆栈损坏问题 经过一番研究 我可以通过以下代码查明原因 class CInternalInterface afx msg void OnMouseMove UINT CPo
  • copy_from_user() 的任何示例吗?内核和用户空间

    我正在寻找将 PID 值从用户空间复制到内核空间 这是我的代码快照 内核模块 include
  • c# 使用高级 datagridview (ADGV) 过滤器而不使用 BindingSource

    我正在使用高级 DataGridView ADGV 发现here向我的应用程序添加过滤功能 过滤或排序的代码如下 private void advancedDataGridView1 SortStringChanged object sen