【问题标题】:How to search/filter the datagridview in textchanged event如何在 textchanged 事件中搜索/过滤 datagridview
【发布时间】:2015-11-07 11:00:54
【问题描述】:

我想使用文本框过滤我的DataGridView 项目,该文本框在输入字母后会立即更改结果(在TextChanged 事件中)。 问题是我只找到了一种使用 SQL 连接和选择查询的方法。

DataSource 对应 DataGridView 的列表:

public static List<string> listaOsob = new List<string>();
static Osoba nr1 = new Osoba(0, "n0", "f0", 1);
static Osoba nr2 = new Osoba(1, "n1", "f1", 1);
static Osoba nr3 = new Osoba(2, "n2", "f2", 1);

我的DataGridViewDataSource 是一个列表,我是这样添加的:

dataGridViewOsob.DataSource = listaOsob;

非常感谢任何帮助和代码示例。

【问题讨论】:

  • 尝试 lambdas:dataGridViewOsob.DataSource = listaOsob.Where(o =&gt; o.Field2.StartsWith(textBox1.Text)); 您可以使用任何您喜欢的字符串比较:StartsWithContainsEquals 等。人。在TextBox.TextChanged 事件处理程序中使用此方法。

标签: c# winforms search datagridview filter


【解决方案1】:

我的 Osoba 班级声明

public class Osoba
{
    public int id {get;set;}
    public string name1 {get;set;}
    public string name2 {get;set;}
    public int num {get;set;}

    public Osoba(int _id, string _name1, string _name2, int _num)
    {
        this.id = _id;
        this.name1 = _name1;
        this.name2 = _name2;
        this.num = _num;
    }
 }

静态声明列表(基于您的代码)

public static List<Osoba> listOsob = new List<Osoba>()
{   new Osoba(0, "n0", "f0", 1)
    , new Osoba(1, "n1", "f1", 1)
    , new Osoba(2, "n2", "f2", 1)
};

在我的表单加载

dataGridView1.DataSource = listOsob;

我的文字改变

List<Osoba> newList = new List<Osoba>();
string search = textBox1.Text;

foreach (Osoba item in listOsob)
{
   var props = item.GetType().GetProperties();
   foreach (var prop in props)
   {
      if (Convert.ToString(prop.GetValue(item, null)).Contains(search))
      {
          newList.Add(item);
          break;
      }
   }
}
dataGridView1.DataSource = search == "" ? listOsob : newList;

希望这会有所帮助。

编辑:如果你想指定你的过滤器,你可以像这样编辑过滤器。

foreach (var prop in props)
   {
      if (
            (prop.Name == "name1") 
            || (prop.Name == "name2"))
      {
         if (Convert.ToString(prop.GetValue(item, null)).Contains(search))
         {
             newList.Add(item);
             break;
         }
      }
   }

编辑:如果您的过滤器有点难以派生,我深表歉意,并且根据该规范,我建议您像下面这样对您的过滤器进行编码。替换这个

foreach (var prop in props)
   {
      if (
            (prop.Name == "name1") 
            || (prop.Name == "name2"))
      {
         if (Convert.ToString(prop.GetValue(item, null)).Contains(search))
         {
             newList.Add(item);
             break;
         }
      }
   }

有了这个

foreach (Osoba item in listOsob)
    {
       if (
            item.name1.Contains(search) 
         && item.name2.Contains(search) 
       )
       {
          newList.Add(item);
       }
    }

【讨论】:

  • 谢谢。这解决了问题。有什么方法可以只按 name1 和 name2 过滤吗?
  • 我已经进行了编辑,指定了过滤器的属性名称,希望这会有所帮助。
  • 谢谢!那也行得通。我想问你最后一件事:有没有办法通过 name1 和 name2 而不是 name1 或 name2 过滤网格?
  • 我已经进行了编辑,希望这仍然有帮助。谢谢
  • 谢谢。这对我帮助很大。
【解决方案2】:

为什么将 nr1,nr2,nr3 声明为静态?

您可以使用您的类字段作为 DataGridView 的源。 根据您的问题,可能是这样的:

public class Osoba
{
    [DisplayName("Id")]
    public int Field1{ get;set; }

    [DisplayName("Name")]
    public string Field2{ get;set; }

    [DisplayName("Name2")]
    public string Field3{ get;set; }

    [DisplayName("Id2")]
    public int Field4{ get;set; }
}

DisplayName 注释将是列名。

您也可以使用注释标记字段:[Browsable(false)] 如果您不希望该字段必须显示在表结构中

然后你可以像这样初始化你的数据集合:

public static List<Osoba> listaOsob = new List<Osoba>
{
    new Osoba(0, "n0", "f0", 1),
    new Osoba(1, "n1", "f1", 1),
    new Osoba(2, "n2", "f2", 1)
};

最后设置你的datagridView数据源:

dataGridViewOsob.DataSource = listaOsob; 

应该可以的。

讨论了使用各种 DataSource 类型更新 textChanged 事件上的 DataGridRow 内容here

【讨论】:

  • 这个对我没有帮助。我无法将我的类对象添加到 DataTable 对象。
  • 我不明白您的问题描述中的 listaOsob 初始化有问题。我更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-18
  • 1970-01-01
相关资源
最近更新 更多