2013-02-15 5 views
1

вот мой «проект»:DataGridView XElement фильтрация через Textbox текст

project

То, что я пытаюсь сделать, это загрузить данные из внешнего файла .xml в DataGrid:

XElement Persons = XElement.Load(@"d:\persons.xml"); 
dataGrid1.DataContext = Persons; 

Он работает нормально, но вот проблема, которую я не могу понять: в верхней части DataGrid вы можете видеть TextBox, поэтому мне нужно использовать textBox1.text в качестве фильтра данных для DataGrid. Предположим, что если пользователь вводит букву «a», в DataGriw мы должны видеть только 2 строки с именем pAul и row со страной russiA, заставляя обе строки содержать букву «a» в своих данных. Если вы также поможете мне включить и исключить некоторые аббревиатуры столбцов для поиска, это будет просто великолепно. И, наконец, если пользователь нажимает на строку, которую он нашел, используя кнопку поиска - данные от продаж должны быть помещены на этикетки справа. Я также был бы рад узнать, как загружать данные из выбранной строки, которая на самом деле не отображается в DataGrid. Скажем, если в XML-файле у нас есть данные о зарплате, но мы не показываем его в DataGrid, и нам нужно, чтобы он был загружен на четвертый ярлык, когда пользователь делает выбор строки. Вот моя XAML:

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="679" Width="1137"> 
<Grid Height="645" Name="grid1" Width="1119"> 
    <DataGrid Height="300" ItemsSource="{Binding Path=Elements[person]}" Margin="26,42,839,297" Name="dataGrid1" Width="250"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding Path=Element[name].Value}" Header="Name" /> 
      <DataGridTextColumn Binding="{Binding Path=Element[country].Value}" Header="Country" /> 
      <DataGridTextColumn Binding="{Binding Path=Element[age].Value}" Header="Age" /> 
     </DataGrid.Columns> 
    </DataGrid> 
    <TextBox Height="24" HorizontalAlignment="Left" Margin="26,12,0,0" Name="textBox1" VerticalAlignment="Top" Width="250" /> 
    <Label Content="Name goes here on row select" Height="28" HorizontalAlignment="Left" Margin="307,28,0,0" Name="label1" VerticalAlignment="Top" Width="188" /> 
    <Label Content="Country goes here on row select" Height="28" HorizontalAlignment="Left" Margin="307,72,0,0" Name="label2" VerticalAlignment="Top" Width="188" /> 
    <Label Content="Age goes here on row select" Height="28" HorizontalAlignment="Left" Margin="307,120,0,0" Name="label3" VerticalAlignment="Top" Width="188" /> 
</Grid> 

Пожалуйста, поговорите со мной, как для абсолютного новичка, потому что это трудно для меня, чтобы понять, когда вы используете что-то дополнительное смарт. Шаг за шагом высоко ценится. Спасибо ...

+0

Непонятно, что вы просите. Вы спрашиваете о поиске XML с LINQ to XML? Или вы спрашиваете о некотором коде для обновления пользовательского интерфейса? –

+0

Я спрашиваю о том, как фильтровать результаты в datagrid с помощью текстового поля. В Windows Forms я использовал фильтр набора данных, но здесь я понятия не имею, как это сделать. – Mike

ответ

1

Для фильтрации DataGrid необходимо создать CollectionViewSource и назначить его ItemsSource из DataGrid:

private void Load() 
{   
     XElement Persons = XElement.Load(@"d:\persons.xml"); 

     System.ComponentModel.ICollectionView c = System.Windows.Data.CollectionViewSource.GetDefaultView(Persons.Elements()); 
     c.Filter = new Predicate<object>(CollectionViewSource_Filter); 

     dataGrid1.ItemsSource = c; 
} 

private Boolean CollectionViewSource_Filter(object i) 
{ 
     return (i as XElement).Element("name").Value.ToString.Contains(textBox1.Text); 
} 

Чтобы обновить DataGrid, когда фильтр изменился, необходим этот метод : c.Refresh();

Если фильтр должен быть чувствителен к регистру, взглянуть на Case insensitive 'Contains(string)'

Отображение имени выбранного лица:

<TextBlock Text="{Binding Path=SelectedItem.Element[name].Value, ElementName=dataGrid1}"></TextBlock> 
+0

Благодарим вас за ответ. Но этот код возвращает мне пару ошибок, вот они: Ошибка 1 Самый лучший перегруженный метод для «System.Windows.Data.CollectionViewSource.GetDefaultView (object)» имеет некоторые недопустимые аргументы Ошибка 2 Аргумент «1»: преобразование типа " групповые методы "в" объекте "не разрешены Ошибка 3" объект WpfApplication1.MainWindow.CollectionViewSource_Filter (System.Xml.Linq.XElement) "имеет неправильный тип возврата – Mike

+0

Ошибка 4 Невозможно неявно преобразовать тип« System.Predicate "in" System.Predicate ". Существует явное преобразование (из-за отсутствия приведения) Ошибка 5 "string.ToString (System.IFormatProvider)" - это метод, который недопустим в этом контексте – Mike

+0

Извините, моя ошибка Я написал код в VB.NET а затем просто преобразует его в C# без проверки результата. Смотрите мое обновленное сообщение, пожалуйста. – alu

Смежные вопросы