【问题标题】:DataView Rowfilter Expression C#DataView 行过滤器表达式 C#
【发布时间】:2016-09-01 16:24:11
【问题描述】:

我有一个数据表,其中一列是特定类型的对象,比如 typeOf(A) - A 是我的自定义类。 A 类具有文本属性和其他属性,如 bool。从用户或外部代码中,我只获得要在 RowFilter 中用于过滤的文本值,在下面的示例中,我将获得“cat”作为我要使用的过滤器。使用这个如何创建 RowFilterExpression?

class A
{
   public string Text{get;set;}
   public bool isReadonly {get;set;}
} 

DataTable table = new DataTable();
table.Columns.Add("col1", typeOf(A));
table.Rows.Add(new A{Text = "cat", isReadOnly = true,})
table.Rows.Add(new A{Text = "dog", isReadOnly = false,})

string filter = "cat";

DataView dataView = new DataView(table);
dataView.RowFilter = "[col1]='"+filter+"'";

上面的表达式不起作用,因为它试图将它与单元格中的对象匹配。如何使用此过滤器表达式单独过滤掉第一行?

感谢任何帮助。

【问题讨论】:

    标签: c# dataview rowfilter


    【解决方案1】:

    尝试在您的对象中覆盖 ToString 方法,然后您当前的过滤代码应该可以工作

    class A
    {
       public string Text{get;set;}
       public bool isReadonly {get;set;}
    
       public override string ToString()
       {
          return this.Text;
       }
    } 
    

    【讨论】:

    • 被覆盖的 ToString 在我的测试中始终存在,但它对过滤没有帮助,技巧在于 rowFilter 表达式。无论如何,谢谢。
    • 但是您发布的代码没有覆盖ToString 方法,您也没有提到您的测试中有它
    • 但它现在对你有用!但是,即使仅使用覆盖的 ToString 方法进行测试,它也对我有用。
    【解决方案2】:

    像这样覆盖对象 ToString 方法:

    class A
    {
        public string Text { get; set; }
        public bool isReadonly { get; set; }
    
        public override string ToString()
        {
            return this.Text;
        }
    }
    

    你可以使用:

    dataView.RowFilter = string.Format("Convert([col1], 'System.String') = '{0}'", filter);
    

    【讨论】:

    • 仅当您还从另一个答案中实现 ToString 方法时才有效。这会编译并执行,但实际上并没有返回任何结果。
    • 感谢 remak,你是对的,我已经更改了我的代码。
    • 您的更新现在显然可以工作了,但是不需要在过滤器中转换为字符串,因为这是默认完成的。
    • 因为它只是其他人回答的副本,您不需要转换。
    • 你可以这样做:table.CaseSensitive = false;
    猜你喜欢
    • 2012-07-25
    • 2011-08-25
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多