I have a tab-control with three tab items. each tab item has a datagrid placed on it.
and all these three datagrid's on their respective tab items is of Master-Detail-SubDetail form.
how to move from first tab item to the second tab item when a user selects a row on the Master datagrid? I have created a Model using ADO.Net entity framework to create this master-detail view.
XAML layout
<TabControl Height="270" HorizontalAlignment="Left" Margin="16,23,0,0" Name="tabControl1" VerticalAlignment="Top" Width="462">
<TabItem Header="Person" Name="tabItem1">
<Grid DataContext="{StaticResource peopleViewSource}">
<DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True" Height="166" SelectedItem="{Binding personDetails}"
HorizontalAlignment="Left" ItemsSource="{Binding}" Margin="64,23,0,0" Name="peopleDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" VerticalAlignment="Top" Width="289">
<DataGrid.Columns>
<DataGridTextColumn x:Name="personIDColumn" Binding="{Binding Path=personID}" Header="person ID" Width="SizeToHeader" />
<DataGridTextColumn x:Name="firstNameColumn" Binding="{Binding Path=firstName}" Header="first Name" Width="SizeToHeader" />
<DataGridTextColumn x:Name="lastNameColumn" Binding="{Binding Path=lastName}" Header="last Name" Width="SizeToHeader" />
</DataGrid.Columns>
</DataGrid>
</Grid>
</TabItem>
<TabItem Header="Person Details" Name="tabItem2">
<Grid DataContext="{StaticResource peoplepersonDetailsViewSource}">
<DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True" Height="120" SelectedItem="{Binding personDetails.personStatus}"
HorizontalAlignment="Left" ItemsSource="{Binding}" Margin="82,18,0,0" Name="personDetailsDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" VerticalAlignment="Top" Width="172">
<DataGrid.Columns>
<DataGridTextColumn x:Name="detailIDColumn" Binding="{Binding Path=detailID}" Header="detail ID" Width="SizeToHeader" />
<DataGridTextColumn x:Name="positionColumn" Binding="{Binding Path=position}" Header="position" Width="SizeToHeader" />
<DataGridTextColumn x:Name="personIDColumn1" Binding="{Binding Path=personID}" Header="person ID" Width="SizeToHeader" />
</DataGrid.Columns>
</DataGrid>
</Grid>
</TabItem>
<TabItem Header="Person Status" Name="tabItem3">
<Grid DataContext="{StaticResource peoplepersonDetailspersonStatusViewSource}">
<DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True" Height="143" HorizontalAlignment="Left" ItemsSource="{Binding}" Margin="91,23,0,0" Name="personStatusDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" VerticalAlignment="Top" Width="185">
<DataGrid.Columns>
<DataGridTextColumn x:Name="detailIDColumn1" Binding="{Binding Path=detailID}" Header="detail ID" Width="SizeToHeader" />
<DataGridTextColumn x:Name="positionColumn1" Binding="{Binding Path=position}" Header="position" Width="SizeToHeader" />
<DataGridTextColumn x:Name="statussColumn" Binding="{Binding Path=statuss}" Header="statuss" Width="SizeToHeader" />
</DataGrid.Columns>
</DataGrid>
</Grid>
</TabItem>
</TabControl>
You could setup a EventTrigger on the DataGrid SelectionChanged event
Because EventTrigger only allowa Animation you can setup a Int32AnimationUsingKeyFrames animation to change the TabControl SelectedIndex
Trigger
<DataGrid.Triggers>
<EventTrigger RoutedEvent="DataGrid.SelectionChanged" > // SelectionChanged Event
<BeginStoryboard>
<Storyboard >
<Int32AnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="tabControl1" Storyboard.TargetProperty="SelectedIndex"> // set target control and target property
<SplineInt32KeyFrame KeyTime="00:00:00" Value="1"/> // Value = TabControl Selected index you want to show
</Int32AnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</DataGrid.Triggers>
Here is an example:
<TabControl Height="270" HorizontalAlignment="Left" Margin="16,23,0,0" Name="tabControl1" VerticalAlignment="Top" Width="462">
<TabItem Header="Person" Name="tabItem1">
<Grid DataContext="{StaticResource peopleViewSource}">
<DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True" Height="166" SelectedItem="{Binding personDetails}"
HorizontalAlignment="Left" ItemsSource="{Binding}" Margin="64,23,0,0" Name="peopleDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" VerticalAlignment="Top" Width="289">
<DataGrid.Columns>
<DataGridTextColumn x:Name="personIDColumn" Binding="{Binding Path=personID}" Header="person ID" Width="SizeToHeader" />
<DataGridTextColumn x:Name="firstNameColumn" Binding="{Binding Path=firstName}" Header="first Name" Width="SizeToHeader" />
<DataGridTextColumn x:Name="lastNameColumn" Binding="{Binding Path=lastName}" Header="last Name" Width="SizeToHeader" />
</DataGrid.Columns>
<DataGrid.Triggers>
<EventTrigger RoutedEvent="DataGrid.SelectionChanged" >
<BeginStoryboard>
<Storyboard >
<Int32AnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="tabControl1" Storyboard.TargetProperty="SelectedIndex">
<SplineInt32KeyFrame KeyTime="00:00:00" Value="1"/>
</Int32AnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</DataGrid.Triggers>
</DataGrid>
</Grid>
</TabItem>
......
Here is my mockup
Code:
namespace WpfApplication7
{
public partial class MainWindow : Window
{
private Person _selectedPerson;
private ObservableCollection<Person> _persons = new ObservableCollection<Person>();
public MainWindow()
{
InitializeComponent();
Items.Add(new Person { personID = "Stack" });
Items.Add(new Person { personID = "Overflow" });
}
public ObservableCollection<Person> Items
{
get { return _persons; }
set { _persons = value; }
}
public Person SelectedPerson
{
get { return _selectedPerson; }
set { _selectedPerson = value; }
}
}
public class Person
{
public string personID { get; set; }
public string firstname { get; set; }
public string lastname { get; set; }
}
}
Xaml:
<Window x:Class="WpfApplication7.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="399" Width="464" Name="UI" >
<Grid>
<TabControl Height="270" HorizontalAlignment="Left" Margin="16,23,0,0" Name="tabControl1" VerticalAlignment="Top" Width="462">
<TabItem Header="Person" Name="tabItem1">
<Grid DataContext="{Binding ElementName=UI, Path=Items}" >
<DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True" Height="166" SelectedItem="{Binding personDetails}"
HorizontalAlignment="Left" ItemsSource="{Binding}" Margin="64,23,0,0" Name="peopleDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" VerticalAlignment="Top" Width="289">
<DataGrid.Columns>
<DataGridTextColumn x:Name="personIDColumn" Binding="{Binding Path=personID}" Header="person ID" Width="SizeToHeader" />
<DataGridTextColumn x:Name="firstNameColumn" Binding="{Binding Path=firstName}" Header="first Name" Width="SizeToHeader" />
<DataGridTextColumn x:Name="lastNameColumn" Binding="{Binding Path=lastName}" Header="last Name" Width="SizeToHeader" />
</DataGrid.Columns>
<DataGrid.Triggers>
<EventTrigger RoutedEvent="DataGrid.SelectionChanged" >
<BeginStoryboard>
<Storyboard >
<Int32AnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="tabControl1" Storyboard.TargetProperty="SelectedIndex">
<SplineInt32KeyFrame KeyTime="00:00:00" Value="1"/>
</Int32AnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</DataGrid.Triggers>
</DataGrid>
</Grid>
</TabItem>
<TabItem Header="Person Details" Name="tabItem2">
<Grid>
<DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True" Height="120" SelectedItem="{Binding personDetails.personStatus}"
HorizontalAlignment="Left" ItemsSource="{Binding}" Margin="82,18,0,0" Name="personDetailsDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" VerticalAlignment="Top" Width="172">
<DataGrid.Columns>
<DataGridTextColumn x:Name="detailIDColumn" Binding="{Binding Path=detailID}" Header="detail ID" Width="SizeToHeader" />
<DataGridTextColumn x:Name="positionColumn" Binding="{Binding Path=position}" Header="position" Width="SizeToHeader" />
<DataGridTextColumn x:Name="personIDColumn1" Binding="{Binding Path=personID}" Header="person ID" Width="SizeToHeader" />
</DataGrid.Columns>
</DataGrid>
</Grid>
</TabItem>
<TabItem Header="Person Status" Name="tabItem3">
<Grid>
<DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True" Height="143" HorizontalAlignment="Left" ItemsSource="{Binding}" Margin="91,23,0,0" Name="personStatusDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" VerticalAlignment="Top" Width="185">
<DataGrid.Columns>
<DataGridTextColumn x:Name="detailIDColumn1" Binding="{Binding Path=detailID}" Header="detail ID" Width="SizeToHeader" />
<DataGridTextColumn x:Name="positionColumn1" Binding="{Binding Path=position}" Header="position" Width="SizeToHeader" />
<DataGridTextColumn x:Name="statussColumn" Binding="{Binding Path=statuss}" Header="statuss" Width="SizeToHeader" />
</DataGrid.Columns>
</DataGrid>
</Grid>
</TabItem>
</TabControl>
</Grid>
</Window>
Related
im trying to select multiple rows/items from a datagrid
<DataGrid IsReadOnly="True" SelectionMode="Extended" SelectionUnit="FullRow" AutoGenerateColumns="False" ItemsSource="{Binding Source={StaticResource ClientiVS}}" SelectedItem="{Binding Path=ClienteSelezionato}" RowHeaderWidth="0" EnableColumnVirtualization="False" CanUserReorderColumns="False" EnableRowVirtualization="False" CanUserAddRows="false" ColumnWidth="*" FontFamily="Agency FB" FontSize="22" Name="DataGrid1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" SelectionChanged="DataGrid1_SelectionChanged" Grid.Row="1" Margin="30,10,30,30">
XAML DATAGRID CODE
<DataGrid.Columns>
<DataGridTextColumn Width="100" FontFamily="Agency FB" FontSize="20" Header="Nome" Binding="{Binding Nome}" ></DataGridTextColumn>
<DataGridTextColumn Width="100" FontFamily="Agency FB" FontSize="20" Header="Cognome" Binding="{Binding Cognome}" ></DataGridTextColumn>
<DataGridTextColumn Width="150" FontFamily="Agency FB" FontSize="20" Header="Indirizzo" Binding="{Binding Indirizzo}"></DataGridTextColumn>
<DataGridTextColumn Width="150" FontFamily="Agency FB" FontSize="20" Header="Telefono" Binding="{Binding NumeroTelefono}"></DataGridTextColumn>
<DataGridTextColumn Width="1*" FontFamily="Agency FB" FontSize="20" Header="Email" Binding="{Binding Email}"></DataGridTextColumn>
<DataGridCheckBoxColumn Header="Selezionato" Binding="{Binding ClienteSelezionato}"/>
</DataGrid.Columns>
</DataGrid>
DATAGRID SELECTIONCHANGED EVENT CODE:
public Cliente ClienteSelezionato { get; set; }
private ObservableCollection<Cliente> _ListaClientiSelezionati;
public ObservableCollection<Cliente> ListaClientiSelezionati { get { return _ListaClientiSelezionati; } set { _ListaClientiSelezionati = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("ListaClientiSelezionati")); } }
private void DataGrid1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (ClienteSelezionato != null )
{
ListaClientiSelezionati.Add(ClienteSelezionato);
}
}
The problem is that: if i select two times the same Row from the DataGrid("ClienteSelezionato") it will obviously insert into the list the same item twice. How can i fix it ?
I just want to implement the control that tells me if an item is already contained in the list ("ListaClientiSelezionati")
Thanks!
I am trying to make a page in an app which will use a datagrid to allow users to view and edit data from a SQL Server database. I would like changes to be saved back to the database immediately after they are made by the user.
I have been trying the CellEditEnding event with SqlCommandBuilder to update the database as edits are made; but after every change it shows 0 updates and nothing is saved.
I can see that the changes in the datagrid are reflected in the datatable, and there is an UpdateCommand generated, but no change is made to the database.
Is there something here that I have missed?
Alternatively is there a way to manually create an update command based on the data in the edited row?
I am new to C# and WPF so any help is appreciated.
EDIT
I have tried using a manually generated UpdateCommand and it still does nothing, so I believe the problem occurs around adapter.Update(dt);. For some reason the data is not saving to the database from the datatable.
Code:
public partial class pgMain : Page
{
private SqlDataAdapter adapter;
private DataTable dt;
public pgMain()
{
InitializeComponent();
}
private void Page_Initialized(object sender, EventArgs e)
{
try
{
string connectionString = ConfigurationManager.ConnectionStrings["connPlanDB"].ConnectionString;
SqlConnection cnn = new SqlConnection(connectionString);
cnn.Open();
adapter = new SqlDataAdapter("SELECT * FROM [AdvProdApp].[dbo].[Orders] WHERE Position > 0 AND Hidden = 0 ORDER BY Linje, Position", cnn);
dt = new DataTable();
adapter.Fill(dt);
ICollectionView indata = CollectionViewSource.GetDefaultView(dt.DefaultView);
indata.GroupDescriptions.Add(new PropertyGroupDescription("Linje"));
Tbl_Plan.DataContext = dt;
cnn.Close();
}
catch (Exception ex)
{
MessageBox.Show("Error: Cannot connect to database");
}
}
private void Tbl_Plan_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
try
{
string connectionString = ConfigurationManager.ConnectionStrings["connPlanDB"].ConnectionString;
SqlConnection cnn = new SqlConnection(connectionString);
cnn.Open();
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
adapter.UpdateCommand = builder.GetUpdateCommand();
int u = adapter.Update(dt);
dt.AcceptChanges();
MessageBox.Show(u.ToString());
cnn.Close();
}
catch (Exception ex)
{
MessageBox.Show("Error: Cannot connect to database");
}
}
}
XAML
<DataGrid x:Name="Tbl_Plan" Margin="100,30,50,100" AlternatingRowBackground="Beige" AlternationCount="2" RenderTransformOrigin="0.5,0.5"
CanUserSortColumns="False" VerticalAlignment="Top" Height="900" VerticalScrollBarVisibility="Visible" CanUserDeleteRows="False"
AutoGenerateColumns="False" ItemsSource="{Binding}" CellEditEnding="Tbl_Plan_CellEditEnding">
<DataGrid.GroupStyle>
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<StackPanel>
<StackPanel Orientation="Horizontal" Background="Black">
<TextBlock Text=" Linje " FontWeight="Bold" FontSize="16" Foreground="White" />
<TextBlock Text="{Binding Name}" FontWeight="Bold" FontSize="16" Foreground="White" />
</StackPanel>
<ItemsPresenter />
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</DataGrid.GroupStyle>
<DataGrid.Columns>
<DataGridTextColumn Header="Plandate" Binding="{Binding Plandate}" IsReadOnly="True" />
<DataGridTextColumn Header="Nr" Binding="{Binding Nr}" IsReadOnly="True" />
<DataGridTextColumn Header="Ordernr" Binding="{Binding Ordernr}" IsReadOnly="True" />
<DataGridTextColumn Header="Ursprungsnr" Binding="{Binding Ursprungsnr}" IsReadOnly="True" />
<DataGridTextColumn Header="Description" Binding="{Binding Description}" IsReadOnly="True" />
<DataGridTextColumn Header="Kundnr" Binding="{Binding Kundnr}" IsReadOnly="True" />
<DataGridTextColumn Header="Kundnamn" Binding="{Binding Kundnamn}" IsReadOnly="True" />
<DataGridTextColumn Header="Duedate" Binding="{Binding Duedate}" IsReadOnly="True" />
<DataGridTextColumn Header="Antal" Binding="{Binding Antal}" IsReadOnly="True" />
<DataGridTextColumn Header="Optisk_Ref" Binding="{Binding Optisk_Ref}" IsReadOnly="True" />
<DataGridTextColumn Header="Gen Info" Binding="{Binding sign_Geninfo, NotifyOnTargetUpdated=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="False" />
<DataGridTextColumn Header="Optisk Start" Binding="{Binding sign_Optiskstart, NotifyOnTargetUpdated=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="False" />
<DataGridTextColumn Header="Optisk Slut" Binding="{Binding sign_Optiskslut, NotifyOnTargetUpdated=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="False" />
<DataGridTextColumn Header="Ingen Optisk Ref" Binding="{Binding sign_Ingenoptisk, NotifyOnTargetUpdated=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="False" />
<DataGridTextColumn Header="Efterblandad" Binding="{Binding Efterblandad, NotifyOnTargetUpdated=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="False" />
<DataGridTextColumn Header="Ändringar" Binding="{Binding Ändringar, NotifyOnTargetUpdated=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="False" />
<DataGridTextColumn Header="Kgh" Binding="{Binding Kgh, NotifyOnTargetUpdated=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="False" />
<DataGridTextColumn Header="Notes" Binding="{Binding Notes, NotifyOnTargetUpdated=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="False" />
</DataGrid.Columns>
</DataGrid>
With this application, first column in grid is check box type with its header says Select. I would like the header to show a check box also. Checking/Unchecking that check box should check or uncheck all items in the grid. How can I do that?
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid Loaded="Data_Loaded" >
<Grid.RowDefinitions>
<RowDefinition Height="6*" />
<RowDefinition />
</Grid.RowDefinitions>
<DataGrid x:Name="grEmployees" HorizontalAlignment="Left" Margin="10,10,0,0" CanUserAddRows="False" CanUserDeleteRows="False"
VerticalAlignment="Top" AlternatingRowBackground="LightBlue" AlternationCount="2" AutoGenerateColumns="False" Grid.Row="0">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Select" Width="2*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox x:Name="chkSelectedDevice" IsChecked="{Binding Path=Configure, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Center" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Last Name" Binding="{Binding LastName, Mode=OneWay}" Width="3*" />
<DataGridTextColumn Header="First Name" Binding="{Binding FirstName, Mode=OneWay}" Width="2*" />
<DataGridTextColumn Header="Description" Binding="{Binding Description, Mode=OneWay}" Width="5*" />
</DataGrid.Columns>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Margin="5" Grid.Row="1" >
<Button x:Name="btnClose" Content="Close" Margin="5" Width="50" />
</StackPanel>
</Grid>
</Window>
public partial class MainWindow : Window
{
private List<Employee> Employees = null;
public MainWindow()
{
InitializeComponent();
}
private void Data_Loaded(object sender, RoutedEventArgs e)
{
Employees = new List<Employee>()
{
new Employee() { IsHardWorking = false, LastName = "Silly", FirstName = "Dude", Description= "this due is a mess" },
new Employee() { IsHardWorking = true, LastName = "Mean", FirstName = "Person", Description= "funny" },
new Employee() { IsHardWorking = false, LastName = "New", FirstName = "Friend", Description= "let her go in next round of layoffs" },
new Employee() { IsHardWorking = true, LastName = "My", FirstName = "Buddy", Description= "simply no comments" },
};
this.grEmployees.ItemsSource = Employees;
}
}
Right, so luckily there's nifty built in ways to customize all sorts of things. In this case we'll just override the default column header template with our own and plop a CheckBox in there.
<DataGridTemplateColumn.Header>
<CheckBox Name="ACheckBox"
Checked="Do_Something"
Unchecked="Do_Something_Else"/>
</DataGridTemplateColumn.Header>
Hope this helps. Cheers
<Grid Loaded="Data_Loaded" >
<Grid.RowDefinitions>
<RowDefinition Height="6*" />
<RowDefinition />
</Grid.RowDefinitions>
<DataGrid x:Name="grEmployees" HorizontalAlignment="Left" Margin="10,10,0,0" CanUserAddRows="False" CanUserDeleteRows="False"
VerticalAlignment="Top" AlternatingRowBackground="LightBlue" AlternationCount="2" AutoGenerateColumns="False" Grid.Row="0">
<DataGrid.Columns>
<DataGridTextColumn>
<DataGridTextColumn.Header>
<StackPanel Orientation="Horizontal">
<CheckBox></CheckBox>
<TextBlock>Test</TextBlock>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTemplateColumn Header="Select" Width="2*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox x:Name="chkSelectedDevice" IsChecked="{Binding Path=Configure, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Center" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Last Name" Binding="{Binding LastName, Mode=OneWay}" Width="3*" />
<DataGridTextColumn Header="First Name" Binding="{Binding FirstName, Mode=OneWay}" Width="2*" />
<DataGridTextColumn Header="Description" Binding="{Binding Description, Mode=OneWay}" Width="5*" />
</DataGrid.Columns>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Margin="5" Grid.Row="1" >
<Button x:Name="btnClose" Content="Close" Margin="5" Width="50" />
</StackPanel>
</DataGrid>
</Grid>
I know one filter in one collection view source but when i use multiple filters in one collection source.Last filter only properly works.Please help me to do multiple filters in one collection view source.
Xaml
<Grid>
<DockPanel>
<DockPanel DockPanel.Dock="Top" Height="90">
<TextBlock VerticalAlignment="Center" Margin="0,9" DockPanel.Dock="Left" >Threshold</TextBlock>
<Slider x:Name="Confidencethreshold" Value="14" Margin="0,5" DockPanel.Dock="Left" Width="200"
Minimum="0" Maximum="50"
ValueChanged="Confidencethreshold_ValueChanged_1"
TickPlacement="BottomRight" TickFrequency="5" IsSnapToTickEnabled="False" SmallChange="1"></Slider>
<StackPanel Orientation="Horizontal" >
<RadioButton x:Name="radioFound" IsChecked="True" Content="Matches" Checked="radioFound_Checked_1" Margin="6" />
<RadioButton x:Name="radioALL" Content="ALL" Checked="radioFound_Checked_1" Margin="6"/>
</StackPanel>
</DockPanel>
<DataGrid Name="DG2" ItemsSource="{Binding}" AutoGenerateColumns="False" CanUserSortColumns="True">
<DataGrid.Columns>
<!--<mui:DataGridCheckBoxColumn Header="Silence Reduction" Binding="{Binding P1}"/>-->
<mui:DataGridTextColumn Header="Segment" Binding="{Binding sname}" IsReadOnly="True" />
<!--<mui:DataGridCheckBoxColumn Header="Trimming" Binding="{Binding trim}" />
<mui:DataGridCheckBoxColumn Header="Format Conversion" Binding="{Binding alaw}"/>
<mui:DataGridCheckBoxColumn Header="Recognition" Binding="{Binding recog}" />-->
<!--<mui:DataGridComboBoxColumn Header="Status" SelectedItemBinding="{Binding Status}" ItemsSource="{Binding Source={StaticResource myEnum}}" />-->
<mui:DataGridTextColumn Header="Key" Binding="{Binding key}" IsReadOnly="True" />
<!--<mui:DataGridTextColumn Header="Confidence" Binding="{Binding conf}" IsReadOnly="True" SortDirection="Ascending" SortMemberPath="{Binding conf}" />-->
<mui:DataGridTextColumn Header="Confidence" Binding="{Binding conf}" IsReadOnly="True" />
</DataGrid.Columns>
</DataGrid>
</DockPanel>
</Grid>
And in c#
MainWindow w1 = (MainWindow)Window.GetWindow(this);
cvs = new CollectionViewSource();
cvs.Source = w1.allresults;
cvs.Filter += cvs_Filter;
DG2.DataContext = cvs;
void cvs_Filter(object sender, FilterEventArgs e)
{
KeysFound t = e.Item as KeysFound;
if (t != null)
// If filter is turned on, filter completed items.
{
if (t.conf < Confidencethreshold.Value)
e.Accepted = false;
else
{
e.Accepted = true;
}
}
}
You can use ICollectionView instead of CollectionViewSource of datagrid source. below link may help..
http://social.msdn.microsoft.com/Forums/vstudio/en-US/82cfac7c-d1f6-421c-8891-1149a90c0dd9/wpf-datagrid-one-itemssource-multiple-views-multiple-filters?forum=wpf
Sorry, my English is bad.
Help me please, I need set selected Item for table in RowDetailsTemplate.
Xaml code:
<Grid>
<DataGrid
Name="GvHeader"
AutoGenerateColumns="False"
HorizontalScrollBarVisibility="Auto"
CanUserDeleteRows="False"
CanUserAddRows="False"
CanUserResizeColumns="True"
CanUserReorderColumns="False"
CanUserResizeRows="False"
AllowDrop="False"
RowDetailsVisibilityMode="Collapsed"
IsReadOnly="True" ClipboardCopyMode="ExcludeHeader" SelectionMode="Single" SelectionChanged="GvHeader_SelectionChanged">
<DataGrid.RowStyle>
<Style TargetType="{x:Type DataGridRow}">
<EventSetter Event="MouseDoubleClick" Handler="HeaderRowDoubleClick"/>
<EventSetter Event="Unselected" Handler="HeaderRowUnselected"></EventSetter>
</Style>
</DataGrid.RowStyle>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<DataGrid x:Name="GvLines"
AutoGenerateColumns="False"
HorizontalScrollBarVisibility="Auto"
CanUserDeleteRows="False"
CanUserAddRows="False"
CanUserResizeColumns="True"
CanUserReorderColumns="False"
CanUserResizeRows="False"
AllowDrop="False"
IsReadOnly="True" ClipboardCopyMode="ExcludeHeader" SelectionMode="Single" ItemsSource="{Binding Path=Lines}"
SelectionChanged="GvLines_SelectionChanged" MouseDoubleClick="GvLines_OnMouseDoubleClick">
<DataGrid.Columns>
<DataGridTemplateColumn x:Name="ShowLineStatus"
CanUserSort="False"
IsReadOnly="True"
Width="22">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image Width="20" Name="pop" Height="20" ToolTip="Восстановить" Source="/Management;component/Images/key_enter.png">
</Image>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding CancelSatatus}" Value="False">
<Setter TargetName="pop" Property="Source" Value="/Management;component/Images/cancel.png"/>
<Setter TargetName="pop" Property="ToolTip" Value="Отменить"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn
x:Name="ColumnNumber"
Header="oooo1"
MinWidth="50" Width="Auto"
Binding="{Binding Path=line1,Mode=OneWay}"/>
<DataGridTextColumn
Header="ooo2"
MinWidth="20" Width="Auto"
CellSt yle="{StaticResource CellStyleCenter}"
Binding="{Binding Path=line2,Mode=OneWay}"/>
<DataGridTextColumn
Header="00003"
MinWidth="50" Width="Auto"
Binding="{Binding Path=line3,Mode=OneWay}"/>
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
<DataGrid.Columns>
<DataGridTextColumn
x:Name="Number"
Header="Номер"
MinWidth="50" Width="Auto"
Binding="{Binding Path=head1,Mode=OneWay}"/>
<DataGridTextColumn
Header="Sss"
MinWidth="20" Width="Auto"
CellSt yle="{StaticResource CellStyleCenter}"
Binding="{Binding Path=head2,Mode=OneWay}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
Code C# for test:
var line1 = new List<ILine>
{
new Line("head11","h1line11", "h1line12", "h1line13", "h1line14"),
new Line("head11","h1line21", "h1line22", "h1line23", "h1line24"),
new Line("head11","h1line31", "h1line32", "h1line33", "h1line34"),
new Line("head11","h1line41", "h1line42", "h1line43", "h1line44")
};
var line2 = new List<ILine>
{
new Line("head21","h2line11", "h2line12", "h2line13", "h2line14"),
new Line("head21","h2line21", "h2line22", "h2line23", "h2line24"),
new Line("head21","h2line31", "h2line32", "h2line33", "h2line34")
};
var header = new List<Header>
{
new Header("head11", "head12", "head13", "head14"),
new Header("head21", "head22", "head23", "head24")
};
header[0].SetLines(line1);
header[1].SetLines(line2);
Global_H_items.AddRange(header);
GvHeader.ItemsSource = null;
GvHeader.ItemsSource = Global_H_items;
I need get access for table "GvLines"
like this (this my method for lock/unlock interface and after unblock I need set select Header item and Line item).
public void IsBlock(bool value, IHeader sel_header, ILine sel_line)
{
if (!this.Dispatcher.CheckAccess())
{
this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action<Boolean, IHeader, ILine>(IsBlock), value, sel_header);
return;
}
GridMain.IsEnabled = value;
if (sel_header != null)
{
GvHeader.ScrollIntoView(sel_header);
GvHeader.SelectedItem = sel_header;
}
if (sel_line != null)
{
var row = (DataGridRow)GvHeader.ItemContainerGenerator.ContainerFromIndex(GvHeader.SelectedIndex);
row.DetailsVisibility = Visibility.Visible;
//Here I need take dgLines table and set selected item. I don't know how make this.
if (dgLines != null)
{
dgLines.ScrollIntoView(sel_line);
dgLines.SelectedItem = sel_line;
}
}
}