C# 通过编程搜索字符串,在dataGrid中选择一行

C# 通过编程搜索字符串,在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

我有一个名为“txtSearch”的文本框

我还有一个DataGrid,它是以编程方式填充的

现在我想在DataGridView中搜索txtSearch.text,并在此基础上选择整行

我希望它以编程方式完成。我的意思是不使用XAML


有可能吗?

首先,如果你在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的心态吧,它无关紧要,笨拙,生成糟糕的代码,让人觉得不成熟

首先,如果你在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的心态吧,它无关紧要,笨拙,生成糟糕的代码,让人觉得不成熟

您可能希望像下面的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

您可能希望像下面的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