如何使用文本框筛选Datagrid的值 (WPF C#)

4

我在使用WPF C#时遇到了一些麻烦,需要使用文本框来过滤来自数据库的数据网格值。确实,我是新手,需要在这种情况下寻求帮助。

enter image description here

这是我的XAML:

<Button Name="btnSelect"
        Content="Select All"
        Height="30"
        Width="80"
        Margin="4"
        HorizontalAlignment="Center"
        Click="btn_SelectUser"/>
    <DataGrid Name="dtgUser" 
              AutoGenerateColumns="True" 
              HorizontalAlignment="Left" 
              VerticalAlignment="Top" Height="380" Width="684" 
              Margin="10,54,0,0"/>

这是我的代码后台,用于在按下“选择”按钮后从数据库中选择值:

private void btn_SelectUser(object sender, RoutedEventArgs e)
        {

            _con = new SqlConnection(_strConn);
            try
            {
                _con.Open();
                string query = "select id_int_user, name_str_user  from tbl_user";
                _cmd = new SqlCommand(query, _con);
                _cmd.ExecuteNonQuery();

                _adp = new SqlDataAdapter(_cmd);
                _dt = new DataTable("tbl_user");
                _adp.Fill(_dt);
                dtgUser.ItemsSource = _dt.DefaultView;
                _adp.Update(_dt);

                _con.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }

这是选择文本框中刚编辑的值的方法。如何实现?(注意:我需要通过数据网格从数据库获取值):
private void txt_SearchUser(object sender, TextChangedEventArgs e)
    {
        //Here is my difficulty //I know nothing how to do it.
    }

DataGridItemsSource 属性可以让你将数据放入其中,但它只接受 IEnumerable<T> 类型的数据,因此你可能需要找到一个解决方法。 - Clive DM
为什么要从数据库返回所有值?如果该值已经被输入,为什么不在SQL查询中添加where子句呢? - Nikerym
@Nikerym 他使用了 Update 将数据放入了 DataTable 中。我猜他想从客户端查询并过滤所有数据。 - Clive DM
2个回答

0

在视图模型中使用ICollectionView作为DataGrid.ItemsSource,并设置Filter以过滤项目。

首先,准备一个集合对象(例如ObservableCollection<YourItemClass>),并在视图模型中定义SourceItems

public ICollectionView SourceItems {
  get {
    return _sourceItems 
      ?? (_sourceItems = CollectionViewSource.GetDefaultView(_source));
  }
}

然后响应一些事件,在视图中添加过滤谓词来过滤项目:

var items = (ListCollectionView)SourceItems;
items.Filter = obj => obj.UserName == user_name_for_filter;

当然,还要设置绑定。

<Window.DataContext>
  <local:YourViewModel />
</Window.DataContext>

<DataGrid ItemsSource={Binding SourceItems} ... />

0

你的方法可能不是填充DataGrid的最佳方式(将来你可能想使用数据绑定),但是这里有一些适用于你情况的快速技巧:

1)如果用户需要先点击“全选”按钮,然后按ID筛选数据:

private void txt_SearchUser(object sender, TextChangedEventArgs e)
{
    DataTable tempDt = _dt.Copy();
    tempDt.Clear();
    if (txt_Search.Text != "") // Note: txt_Search is the TextBox..
    {
        foreach (DataRow dr in _dt.Rows)
        {
            if (dr["id_int_user"].ToString() = txt_Search.Text)
            {
                tempDt.ImportRow(dr);
            }
        }
        dtgUser.ItemsSource = tempDt.DefaultView;
    }
    else
    {
        dtgUser.ItemsSource = _dt.DefaultView;
    }
}

2) 如果您想在用户将ID放入搜索框中时每次从数据库过滤数据(而无需先单击“全选”按钮):

private void txt_SearchUser(object sender, TextChangedEventArgs e)
{
    _con = new SqlConnection(_strConn);
    try
    {
        _con.Open();
        string query = "select id_int_user, name_str_user from tbl_user";
        if(txt_Search.Text != "") // Note: txt_Search is the TextBox..
        {
            query += " where id_int_user = " + txt_Search.Text;
        }
        _cmd = new SqlCommand(query, _con);
        _cmd.ExecuteNonQuery();

        _adp = new SqlDataAdapter(_cmd);
        _dt = new DataTable("tbl_user");
        _adp.Fill(_dt);
        dtgUser.ItemsSource = _dt.DefaultView;
        _adp.Update(_dt);

        _con.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

当用户开始在文本框中输入ID时,我想自动使用此代码使数据网格根据文本框中的ID显示结果。如何在不按按钮的情况下实现这一点? - Wesley Heron
如果这是您需要的,那么我认为这个答案中的第二个示例应该适合您。 - Ignatius
是的,第二个例子接近我需要的答案。但是当我输入有效的ID时,什么也没有发生。 - Wesley Heron
嗯...这很奇怪...这个例子基本上只是在您原来的代码中添加了一个where子句。所以,如果您的“btn_SelectUser”函数可用,那么这应该是有效的。您已将其注册为TextChanged事件处理程序,对吧?即 <TextBox x:Name="txt_Search" TextChanged="txt_SearchUser" /> - Ignatius
谢谢。现在它可以工作了。只需在XAML中添加 TextChanged = "txt_SearchUser" 即可。 - Wesley Heron
知道就好。顺便提一下,你可能还需要在那个文本框上添加一些输入验证,例如:如果用户输入非整数值,则不要处理任何内容等等。 - Ignatius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接