C# 通过编程搜索字符串,在dataGrid中选择一行
我有一个名为“txtSearch”的文本框 我还有一个DataGrid,它是以编程方式填充的 现在我想在DataGridView中搜索txtSearch.text,并在此基础上选择整行 我希望它以编程方式完成。我的意思是不使用XAMLC# 通过编程搜索字符串,在dataGrid中选择一行,c#,wpf,vb.net,search,datagrid,C#,Wpf,Vb.net,Search,Datagrid,我有一个名为“txtSearch”的文本框 我还有一个DataGrid,它是以编程方式填充的 现在我想在DataGridView中搜索txtSearch.text,并在此基础上选择整行 我希望它以编程方式完成。我的意思是不使用XAML 有可能吗?首先,如果你在WPF中做一些事情,你最好这样做 如果您对学习XAML和MVVM不感兴趣,那么您宁愿回到恐龙无用的技术上来 <Window x:Class="MiscSamples.DataGridSearch" xmlns="htt
有可能吗?首先,如果你在WPF中做一些事情,你最好这样做 如果您对学习XAML和MVVM不感兴趣,那么您宁愿回到恐龙无用的技术上来
<Window x:Class="MiscSamples.DataGridSearch"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="DataGridSearch" Height="300" Width="300">
<DockPanel>
<DockPanel DockPanel.Dock="Top">
<TextBlock Text="Search:" DockPanel.Dock="Left"/>
<TextBox Text="{Binding SearchString, UpdateSourceTrigger=PropertyChanged}"/>
</DockPanel>
<DataGrid ItemsSource="{Binding ItemsView}" AutoGenerateColumns="True"/>
</DockPanel>
</Window>
视图模型:
public class DataGridSearchViewModel: PropertyChangedBase
{
private string _searchString;
public string SearchString
{
get { return _searchString; }
set
{
_searchString = value;
OnPropertyChanged("SearchString");
ItemsView.Refresh();
}
}
private ICollectionView _itemsView;
public ICollectionView ItemsView
{
get { return _itemsView; }
}
private ObservableCollection<DataGridSearchModel> _items;
public ObservableCollection<DataGridSearchModel> Items
{
get { return _items ?? (_items = new ObservableCollection<DataGridSearchModel>()); }
}
public DataGridSearchViewModel()
{
_itemsView = CollectionViewSource.GetDefaultView(Items);
_itemsView.Filter = x => Filter(x as DataGridSearchModel);
Enumerable.Range(0, 100)
.Select(x => CreateRandomItem())
.ToList()
.ForEach(Items.Add);
}
private bool Filter(DataGridSearchModel model)
{
var searchstring = (SearchString ?? string.Empty).ToLower();
return model != null &&
((model.LastName ?? string.Empty).ToLower().Contains(searchstring) ||
(model.FirstName ?? string.Empty).ToLower().Contains(searchstring) ||
(model.Address ?? string.Empty).ToLower().Contains(searchstring));
}
private DataGridSearchModel CreateRandomItem()
{
return new DataGridSearchModel
{
LastName = RandomGenerator.GetNext(1),
FirstName = RandomGenerator.GetNext(1),
Address = RandomGenerator.GetNext(4)
};
}
}
PropertyChangedBase(MVVM帮助程序类):
随机生成器(仅用于生成随机字符串)
公共静态类随机生成器
{
私有静态字符串TestData="知识本身是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德有时,如果你不轻率,就必须为自己的行为负责;
私有静态列表词;
私有静态int-maxword;
私有静态随机=新随机();
静态随机发生器()
{
words=TestData.Split(“”).ToList();
maxword=words.Count-1;
}
公共静态字符串GetNext(int字数)
{
返回字符串.Join(“),可枚举.Range(0,字数)
.选择(x=>words[random.Next(0,maxword)]);
}
公共静态int GetNextInt(int最小值,int最大值)
{
返回random.Next(最小值、最大值);
}
}
结果:
- 完全MVVM
- 没有一行代码可以操纵任何UI元素。这是WPF的方式
文本框中的
绑定使其在键入时进行搜索UpdateSourceTrigger=PropertyChanged
- 完全强类型对象模型比使用
之类的东西要好得多DataTables
- WPF太棒了。只需将我的代码复制并粘贴到
,然后自己查看结果文件->新项目->WPF应用程序中
- 忘了winforms的心态吧,它无关紧要,笨拙,生成糟糕的代码,让人觉得不成熟
<Window x:Class="MiscSamples.DataGridSearch"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="DataGridSearch" Height="300" Width="300">
<DockPanel>
<DockPanel DockPanel.Dock="Top">
<TextBlock Text="Search:" DockPanel.Dock="Left"/>
<TextBox Text="{Binding SearchString, UpdateSourceTrigger=PropertyChanged}"/>
</DockPanel>
<DataGrid ItemsSource="{Binding ItemsView}" AutoGenerateColumns="True"/>
</DockPanel>
</Window>
视图模型:
public class DataGridSearchViewModel: PropertyChangedBase
{
private string _searchString;
public string SearchString
{
get { return _searchString; }
set
{
_searchString = value;
OnPropertyChanged("SearchString");
ItemsView.Refresh();
}
}
private ICollectionView _itemsView;
public ICollectionView ItemsView
{
get { return _itemsView; }
}
private ObservableCollection<DataGridSearchModel> _items;
public ObservableCollection<DataGridSearchModel> Items
{
get { return _items ?? (_items = new ObservableCollection<DataGridSearchModel>()); }
}
public DataGridSearchViewModel()
{
_itemsView = CollectionViewSource.GetDefaultView(Items);
_itemsView.Filter = x => Filter(x as DataGridSearchModel);
Enumerable.Range(0, 100)
.Select(x => CreateRandomItem())
.ToList()
.ForEach(Items.Add);
}
private bool Filter(DataGridSearchModel model)
{
var searchstring = (SearchString ?? string.Empty).ToLower();
return model != null &&
((model.LastName ?? string.Empty).ToLower().Contains(searchstring) ||
(model.FirstName ?? string.Empty).ToLower().Contains(searchstring) ||
(model.Address ?? string.Empty).ToLower().Contains(searchstring));
}
private DataGridSearchModel CreateRandomItem()
{
return new DataGridSearchModel
{
LastName = RandomGenerator.GetNext(1),
FirstName = RandomGenerator.GetNext(1),
Address = RandomGenerator.GetNext(4)
};
}
}
PropertyChangedBase(MVVM帮助程序类):
随机生成器(仅用于生成随机字符串)
公共静态类随机生成器
{
私有静态字符串TestData=”知识本身是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德有时,如果你不轻率,就必须为自己的行为负责;
私有静态列表词;
私有静态int-maxword;
私有静态随机=新随机();
静态随机发生器()
{
words=TestData.Split(“”).ToList();
maxword=words.Count-1;
}
公共静态字符串GetNext(int字数)
{
返回字符串.Join(“),可枚举.Range(0,字数)
.选择(x=>words[random.Next(0,maxword)]);
}
公共静态int GetNextInt(int最小值,int最大值)
{
返回random.Next(最小值、最大值);
}
}
结果:
- 完全MVVM
- 没有一行代码可以操纵任何UI元素。这是WPF的方式
文本框中的
绑定使其在键入时进行搜索UpdateSourceTrigger=PropertyChanged
- 完全强类型对象模型比使用
之类的东西要好得多DataTables
- WPF太棒了。只需将我的代码复制并粘贴到
,然后自己查看结果文件->新项目->WPF应用程序中
- 忘了winforms的心态吧,它无关紧要,笨拙,生成糟糕的代码,让人觉得不成熟
Dim m_Dt As New DataTable
Dim m_Bs As New BindingSource
Private Sub createDatatable()
m_Dt.Columns.Clear()
m_Dt.Columns.Add("FieldKey", GetType(System.Int16))
m_Dt.Columns.Add("Field1", GetType(System.String))
m_Dt.Columns.Add("Field2", GetType(System.String))
End Sub
Private Sub PopulateDatatable()
For i As Integer = 0 To 10
Dim dr As DataRow = m_Dt.NewRow
dr("FieldKey") = i
dr("Field1") = String.Format("field1Value-{0}", i)
dr("field2") = String.Format("Field2Value-{0}", i)
dr = m_Dt.Rows.Add
Next
End Sub
Private Sub BindDatatableToDataGridView()
m_Bs.DataSource = m_Dt
m_DataGridview.DataSource = m_Bs
End Sub
Private Sub FindTextAndFocusOnRow()
m_Bs.Position = m_Bs.Find("FieldKey", m_TxtSearchText.Text)
End Sub
Private Sub ModifyRowValues()
m_Dt.Rows(m_Bs.Position)("Field1") = "FieldModified"
End Sub
您可能希望像下面的ff.代码一样使用数据绑定
Dim m_Dt As New DataTable
Dim m_Bs As New BindingSource
Private Sub createDatatable()
m_Dt.Columns.Clear()
m_Dt.Columns.Add("FieldKey", GetType(System.Int16))
m_Dt.Columns.Add("Field1", GetType(System.String))
m_Dt.Columns.Add("Field2", GetType(System.String))
End Sub
Private Sub PopulateDatatable()
For i As Integer = 0 To 10
Dim dr As DataRow = m_Dt.NewRow
dr("FieldKey") = i
dr("Field1") = String.Format("field1Value-{0}", i)
dr("field2") = String.Format("Field2Value-{0}", i)
dr = m_Dt.Rows.Add
Next
End Sub
Private Sub BindDatatableToDataGridView()
m_Bs.DataSource = m_Dt
m_DataGridview.DataSource = m_Bs
End Sub
Private Sub FindTextAndFocusOnRow()
m_Bs.Position = m_Bs.Find("FieldKey", m_TxtSearchText.Text)
End Sub
Private Sub ModifyRowValues()
m_Dt.Rows(m_Bs.Position)("Field1") = "FieldModified"
End Sub
如果你不想使用XAML,为什么要在WPF中实现呢?改用windows窗体。我已经在winforms中创建了一个应用程序。为了简单和好的动画,我正在将我的项目翻译成WPF。如果你翻译成WPF,最好花点时间学习数据绑定,因为它将给你在WPF世界带来巨大的好处。100%同意@tigran,WPF不是关于“好的动画”“这是关于能够真正开发出有用的东西。发布相关代码和XAML,可能还有您需要的屏幕截图。如果您不想使用XAML,为什么要在WPF中实现?改用windows窗体。我已经在winforms中创建了一个应用程序。为了简单和好的动画,我将把我的项目翻译成WPF。如果你翻译成WPF,你最好花点时间学习数据绑定,因为它将给你在WPF世界带来巨大的好处。100%同意@tigran,WPF不是关于“好的动画”。这是关于能够真正开发出有用的东西。发布相关代码和XAML,可能还有您需要的屏幕截图。谢谢您的回答。我是一个VB的家伙。因此,我将首先转换您的代码并尝试实现它。尝试之后,我会在这里。@Vishal有一个可以在VB.Net和C#之间执行转换的安装程序,如果您愿意的话。我在这里遇到一个错误(_items=new observeCollection());错误为Operator=未为System.Collections.Objec定义
Dim m_Dt As New DataTable
Dim m_Bs As New BindingSource
Private Sub createDatatable()
m_Dt.Columns.Clear()
m_Dt.Columns.Add("FieldKey", GetType(System.Int16))
m_Dt.Columns.Add("Field1", GetType(System.String))
m_Dt.Columns.Add("Field2", GetType(System.String))
End Sub
Private Sub PopulateDatatable()
For i As Integer = 0 To 10
Dim dr As DataRow = m_Dt.NewRow
dr("FieldKey") = i
dr("Field1") = String.Format("field1Value-{0}", i)
dr("field2") = String.Format("Field2Value-{0}", i)
dr = m_Dt.Rows.Add
Next
End Sub
Private Sub BindDatatableToDataGridView()
m_Bs.DataSource = m_Dt
m_DataGridview.DataSource = m_Bs
End Sub
Private Sub FindTextAndFocusOnRow()
m_Bs.Position = m_Bs.Find("FieldKey", m_TxtSearchText.Text)
End Sub
Private Sub ModifyRowValues()
m_Dt.Rows(m_Bs.Position)("Field1") = "FieldModified"
End Sub