我在使用Textbox过滤datagrid值(来自数据库)时遇到了一些麻烦。事实上,我是WPF C#的新手,在这种情况下我需要一些帮助。
这是我的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"/>
按下Select按钮后,这是我的Code Behind选择数据库中的值:
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);
}
}
这是在文本框中选择刚刚编辑过的值。如何实现此方法? (注意:我需要通过datagrid从数据库中获取值):
private void txt_SearchUser(object sender, TextChangedEventArgs e)
{
//Here is my difficulty //I know nothing how to do it.
}
答案 0 :(得分: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} ... />
答案 1 :(得分:0)
您的方法可能不是填充DataGrid的最佳方式(您可能希望将来使用data binding),但这里有一些针对您的情况的快速技巧:
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);
}
}