"txtSearch"라는 텍스트 상자가 있습니다프로그래밍 방식으로 문자열을 검색하여 dataGrid의 행 선택
프로그래밍 방식으로 채워지는 DataGrid도 있습니다.
이제 DataGridView에서 txtSearch.text를 검색하고이를 기반으로 전체 행을 선택하려고합니다.
프로그래밍 방식으로 수행되기를 원합니다. XAML을 사용하지 않고 의미합니다.
가능합니까?
"txtSearch"라는 텍스트 상자가 있습니다프로그래밍 방식으로 문자열을 검색하여 dataGrid의 행 선택
프로그래밍 방식으로 채워지는 DataGrid도 있습니다.
이제 DataGridView에서 txtSearch.text를 검색하고이를 기반으로 전체 행을 선택하려고합니다.
프로그래밍 방식으로 수행되기를 원합니다. XAML을 사용하지 않고 의미합니다.
가능합니까?
우선 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);
}
}
결과를 (무작위 문자열을 생성) :
UpdateSourceTrigger=PropertyChanged
은 TextBox
바인딩에 입력하면 검색됩니다.DataTables
과 같은 것을 사용하는 것보다 훨씬 강력하게 형식화 된 개체 모델입니다.File -> New Project -> WPF Application
에 붙여 넣은 다음 직접 결과를 확인하십시오.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 양식을 대신 사용하십시오. – Tigran
winforms에서 응용 프로그램을 만들었습니다. 쉽고 좋은 애니메이션을 위해 저는 프로젝트를 WPF로 번역하고 있습니다. – Vishal
WPF로 번역하면 데이터 바인딩을 배우는데 더 많은 시간을 할애하여 WPF 세계에서 거대한 이점을 누릴 수 있습니다. – Tigran