2013-05-27 3 views
1

"txtSearch"라는 텍스트 상자가 있습니다프로그래밍 방식으로 문자열을 검색하여 dataGrid의 행 선택

프로그래밍 방식으로 채워지는 DataGrid도 있습니다.

이제 DataGridView에서 txtSearch.text를 검색하고이를 기반으로 전체 행을 선택하려고합니다.

프로그래밍 방식으로 수행되기를 원합니다. XAML을 사용하지 않고 의미합니다.

가능합니까?

+1

XAML을 사용하지 않으려면 왜 WPF로 구현합니까? Windows 양식을 대신 사용하십시오. – Tigran

+0

winforms에서 응용 프로그램을 만들었습니다. 쉽고 좋은 애니메이션을 위해 저는 프로젝트를 WPF로 번역하고 있습니다. – Vishal

+2

WPF로 번역하면 데이터 바인딩을 배우는데 더 많은 시간을 할애하여 WPF 세계에서 거대한 이점을 누릴 수 있습니다. – Tigran

답변

1

우선 WPF에서 뭔가를한다면 the 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)); 
                   })); 
    } 
} 

랜덤 생성기

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

결과를 (무작위 문자열을 생성) :

enter image description here

  • 완전 MVVM을.
  • 모든 UI 요소를 조작하는 코드가 하나만있는 것은 아닙니다. 이것은 WPF 방식입니다.
  • UpdateSourceTrigger=PropertyChangedTextBox 바인딩에 입력하면 검색됩니다.
  • DataTables과 같은 것을 사용하는 것보다 훨씬 강력하게 형식화 된 개체 모델입니다.
  • WPF 바위. 내 코드를 복사하여 File -> New Project -> WPF Application에 붙여 넣은 다음 직접 결과를 확인하십시오.
  • winforms의 사고 방식을 잊어 버려도 상관 없으며, 어색하고, 코드가 잘못 생성되어 멍청하고 미성숙하다고 느낍니다.
+0

답변 해 주셔서 감사합니다. 나는 VB 녀석이다. 따라서 먼저 코드를 변환하여 구현하려고합니다. 노력한 후에 나는 여기있을 것이다. – Vishal

+0

@Vishal 원하는 경우 VB.Net과 C# 사이에서 변환을 수행 할 수있는 [Visual Studio Extension] (http://visualstudiogallery.msdn.microsoft.com/94c245e9-547a-4e47-87da-08dbcd283d7f)이 있습니다. . –

+0

변환기 주셔서 감사합니다 – Vishal

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 
관련 문제