1

「txtSearch」という名前のテキストボックスがあります

プログラムで埋められる DataGrid もあります。

ここで、DataGridView で txtSearch.text を検索し、それに基づいて行全体を選択したいと考えています。

プログラム的に実行したい。つまり、XAML を使用しないということです。

出来ますか?

4

2 に答える 2

1

まず第一に、WPF で何かをしている場合は、 WPF Wayを使用することをお勧めします。

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 partial class DataGridSearch : Window
{
    public DataGridSearch()
    {
        InitializeComponent();

        DataContext = new DataGridSearchViewModel();
    }
}

ビューモデル:

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

データ項目:

public class DataGridSearchModel:PropertyChangedBase
{
    public string LastName { get; set; }

    public string FirstName { get; set; }

    public string Address { get; set; }
}

PropertyChangedBase (MVVM ヘルパー クラス):

public class PropertyChangedBase:INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        Application.Current.Dispatcher.BeginInvoke((Action) (() =>
                                                                 {
                                                                     PropertyChangedEventHandler handler = PropertyChanged;
                                                                     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
                                                                 }));
    }
}

Random Generator (ランダムな文字列を生成するだけ)

public static class RandomGenerator
{
    private static string TestData = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum";
    private static List<string> words;
    private static int maxword;
    private static Random random = new Random();

    static RandomGenerator()
    {
        words = TestData.Split(' ').ToList();
        maxword = words.Count - 1;
    }

    public static string GetNext(int wordcount)
    {
        return string.Join(" ", Enumerable.Range(0, wordcount)
                                          .Select(x => words[random.Next(0, maxword)]));
    }

    public static int GetNextInt(int min, int max)
    {
        return random.Next(min, max);
    }
}

結果:

ここに画像の説明を入力

  • 完全MVVM。
  • UI 要素を操作するコードは 1 行もありません。これがWPFのやり方です。
  • UpdateSourceTrigger=PropertyChangedバインディングでTextBox入力すると検索されます。
  • 完全に強く型付けされたオブジェクト モデルは、そのようなものを使用するよりもはるかに優れDataTablesています。
  • WPFのロック。コードをコピーして a に貼り付けるだけでFile -> New Project -> WPF Application、結果を確認できます。
  • winforms のメンタリティを忘れてください。それは無関係で、ぎこちなく、悪いコードを生成し、初心者で未熟に感じます。
于 2013-05-27T15:38:35.360 に答える
0

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
于 2013-05-29T10:13:08.747 に答える