如何在textchanged事件中搜索/过滤datagridview

时间:2015-08-14 08:40:22

标签: c# winforms search datagridview filter

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

DataSource的{​​{1}}列表:

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); 的{​​{1}}是一个列表,我是这样添加的:

DataSource

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

为什么你将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 注释将是列名。

此外,您还可以使用注释标记字段: [可浏览(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 dataSource:

dataGridViewOsob.DataSource = listaOsob; 

这应该有效。

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