none
Datagrid - ScrollIntoView - Fehlermeldung: ItemCollection nicht initialisiert RRS feed

  • Frage

  • Hallo,

    ich habe ein Datagrid mittels

    dv = NewDataView(dt)

    dg.DataContext = CollectionViewSource.GetDefaultView(dv)

    gefüllt. Nun möchte ich aus einem anderen Formular mit dg.ScrollIntoView(dg.Items(index)) den aktuellen Datensatz markieren.

    Leider klappt das nicht. Ich bekomme die Fehlermeldung - ItemCollection nicht initialisiert oder

    Bindung mit ItemControl.ItemsSource wird für die Auflistung Null angegeben.

    Kennt sich jemand aus?

    Dirk

    dg.ScrollIntoView(

    Samstag, 28. Juli 2012 15:13

Antworten

  • Ich habe es mal auf eine andere Art probiert:

      private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
       
    {
           
    DataGrid dg = (DataGrid)sender;
           
    if (dg.SelectedItem == null) return;
            dg
    .ScrollIntoView(dg.SelectedItem);

           
    DataGridRow dg_row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromItem(dg.SelectedItem); // der Aufruf soll auch nicht immer funktionieren :-)

     
           
    if (dg_row == null) return;

    Ich arbeite aber eigentlich mit Visual Basic :-). 

    Melde mich, wenn es wirklich läuft.

    Dirk


    • Als Antwort markiert Dirk2006 Dienstag, 9. Oktober 2012 10:28
    Sonntag, 2. September 2012 16:40

Alle Antworten

  • Hallo Dirk2006,

    Poste bitte Deinen ganzen Code: XAML + C# damit man das Problem nachvollziehen kann.

    Relevanter Code zu posten wäre auch nicht schlecht oder eine .zip Datei mit den Code (falls der Code zu groß ist) kann man ihm Public Ordner von SkyDrive laden und den link hier Posten.  (Wie nutze ich den SkyDrive?)

    Schau Dir mal auch folgenden Link an. Vielleicht kann er Dir weiterhelfen.

    How to control the scroll position of a ListBox in a MVVM WPF app (es wird eine ListBox anstatt GridView verwendet)

    Fehlermeldung in Englisch lautet: „ItemCollection is uninitialized or binding on ItemsControl.ItemSource supplied null for collection.“

    Hab auch noch ein wenig herumgebastelt und ohne MVVM hat’s geklappt:

    [XAML]

    <Window x:Class="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">
        <Window.Resources>
            <DataTemplate x:Key="Value1">
                <TextBlock Text="{Binding Value1}" FontSize="14" VerticalAlignment="Center" TextTrimming="CharacterEllipsis"  TextWrapping="WrapWithOverflow"/>
            </DataTemplate>
            <DataTemplate x:Key="Value2">
                <TextBlock Text="{Binding Value2}" FontSize="14"  VerticalAlignment="Center" TextTrimming="CharacterEllipsis" TextWrapping="WrapWithOverflow"/>
            </DataTemplate>
            <DataTemplate x:Key="Value3">
                <TextBlock Text="{Binding Value3}" FontSize="14"  VerticalAlignment="Center" TextTrimming="CharacterEllipsis" TextWrapping="WrapWithOverflow"/>
            </DataTemplate>
    
            <SolidColorBrush x:Key="DataGrid_Style0_Header" Color="#FF4F81BD"/>
            <SolidColorBrush x:Key="DataGrid_Style0_Alt0" Color="White"/>
            <SolidColorBrush x:Key="DataGrid_Style0_Alt1" Color="#FFE7EFFF"/>
            <Style x:Key="ColumnHeaderStyle" TargetType="{x:Type DataGridColumnHeader}" 
                       BasedOn="{StaticResource {x:Type DataGridColumnHeader}}">
                <Setter Property="Background" Value="{StaticResource DataGrid_Style0_Header}" />
                <Setter Property="Foreground" Value="White" />
                <Setter Property="BorderThickness" Value="1"/>
                <Setter Property="BorderBrush" Value="LightGray"/>
                <Setter Property="HorizontalContentAlignment" Value="Center" />
            </Style>
    
            <!--this is the style for the selected row-->
            <Style x:Key="CellStyle" TargetType="{x:Type DataGridCell}">
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="Background" Value="LightBlue" />
                        <Setter Property ="Foreground" Value ="Black" />
                    </Trigger>
                </Style.Triggers>
            </Style>
    
            <Style x:Key="RowStyle" TargetType="DataGridRow" >
                <Style.Triggers>
                    <Trigger Property="AlternationIndex" Value="1" >
                        <Setter Property="Background" Value="{StaticResource DataGrid_Style0_Alt1}" />
                    </Trigger>
                    <Trigger Property="AlternationIndex" Value="0" >
                        <Setter Property="Background" Value="{StaticResource DataGrid_Style0_Alt0}" />
                    </Trigger>
                    <Trigger Property ="IsMouseOver" Value ="True" >
                        <Setter Property ="Background" Value ="LightYellow" />
                        <Setter Property ="Foreground" Value ="Black" />
                    </Trigger>
                </Style.Triggers>
            </Style>
    
        </Window.Resources>
    
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition Height="auto"/>
                <RowDefinition Height="auto"/>
            </Grid.RowDefinitions>
            <DataGrid Grid.Column="0" HorizontalAlignment="Stretch" ItemsSource="{Binding DataGridItemsSource}" AlternationCount="2" RowStyle="{StaticResource RowStyle}" 
              x:Name="dgDataGrid" CanUserReorderColumns="False" VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Visible"
              ColumnHeaderHeight="30" FontSize="16" HeadersVisibility="Column" MinColumnWidth="60" VerticalGridLinesBrush="Transparent"
              AutoGenerateColumns="False" RowHeight="30" CanUserSortColumns="True" SelectionMode="Single" IsEnabled="True" SelectionUnit="FullRow"  CanUserResizeColumns="False" CanUserAddRows="False" IsSynchronizedWithCurrentItem="True">
                <DataGrid.Columns>
                    <DataGridTemplateColumn Header="Value1" CellTemplate="{StaticResource Value1}" Width="150" SortMemberPath="Value1" />
                    <DataGridTemplateColumn Header="Value2" CellTemplate="{StaticResource Value2}" Width="150" SortMemberPath="Value2" />
                    <DataGridTemplateColumn Header="Value3" CellTemplate="{StaticResource Value3}" Width="*" SortMemberPath="Value3" />
                </DataGrid.Columns>
            </DataGrid>
    
            <!--Row 1 GridSplitter-->
            <GridSplitter Grid.Row="1" HorizontalAlignment="Stretch" Margin="5,0,5,0" />
    
            <!--Row 2 Input Controls-->
            <Grid Grid.Row="2">
                <Grid.RowDefinitions>
                    <RowDefinition/>
                    <RowDefinition/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
    
                <Grid  Margin="5" >
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="auto"/>
                        <ColumnDefinition/>
                    </Grid.ColumnDefinitions>
                    <TextBlock Text="Value1: "/>
                    <TextBox Grid.Column="1" HorizontalAlignment="Stretch" Name="txt1"/>
                </Grid>
    
                <Grid Grid.Column="1" Margin="5" >
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="auto"/>
                        <ColumnDefinition/>
                    </Grid.ColumnDefinitions>
                    <TextBlock Text="Value2: "/>
                    <TextBox Grid.Column="1" HorizontalAlignment="Stretch" Name="txt2"/>
                </Grid>
    
                <Grid Grid.Column="2" Margin="5" >
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="auto"/>
                        <ColumnDefinition/>
                    </Grid.ColumnDefinitions>
                    <TextBlock Text="Value3: "/>
                    <TextBox Grid.Column="1" HorizontalAlignment="Stretch" Name="txt3"/>
                </Grid>
    
                <Button Grid.Row="1" Grid.Column="2" Content="Add Item" Margin="5" Click="Button_Click"/>
    
            </Grid>
    
        </Grid>
    </Window>

    [VB.NET]

    Imports System.ComponentModel
    Class MainWindow
        Private myDataGridItemsSource As List(Of MyItem) = New List(Of MyItem)
    
        Public Property DataGridItemsSource() As List(Of MyItem)
            Get
                Return myDataGridItemsSource
            End Get
            Set(ByVal value As List(Of MyItem))
                myDataGridItemsSource = value
            End Set
        End Property
    
        Public Sub New()
    
            PopulateItemsSource()
            Me.DataContext = Me
    
            ' This call is required by the Windows Form Designer.
            InitializeComponent()
    
            ' Add any initialization after the InitializeComponent() call.
        End Sub
    
        Private Sub PopulateItemsSource()
            For i As Integer = 0 To 98 Step 3
                Dim item As New MyItem With {.Value1 = i, .Value2 = i + 1, .Value3 = i + 2}
                DataGridItemsSource.Add(item)
            Next
        End Sub
    
        Private Sub Button_Click(sender As System.Object, e As System.Windows.RoutedEventArgs)
            Try
                Dim item As New MyItem With {.Value1 = txt1.Text, .Value2 = txt2.Text, .Value3 = txt3.Text}
                DataGridItemsSource.Add(item)
                dgDataGrid.Items.Refresh()
                dgDataGrid.UpdateLayout()
                dgDataGrid.ScrollIntoView(dgDataGrid.Items(7))
            Catch ex As Exception
                MessageBox.Show(ex.ToString)
            End Try
         
        End Sub
    
        Public Class MyItem
            Public Property Value1() As String
                Get
                    Return m_value1
                End Get
                Set(ByVal value As String)
                    m_value1 = value
                End Set
            End Property
            Private m_value1 As String
            Public Property Value2() As String
                Get
                    Return m_value2
                End Get
                Set(ByVal value As String)
                    m_value2 = value
                End Set
            End Property
            Private m_value2 As String
            Public Property Value3() As String
                Get
                    Return m_value3
                End Get
                Set(ByVal value As String)
                    m_value3 = value
                End Set
            End Property
            Private m_value3 As String
        End Class
    
       
    
    End Class

    Danke und Grüße,

    Robert


    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Mittwoch, 8. August 2012 14:25
    Moderator
  • ****************************************************************************************************************
    Dieser Thread wurde mangels weiterer Beteiligung des Fragestellenden ohne bestätigte Lösung abgeschlossen.
    Neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.
    ****************************************************************************************************************

    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Freitag, 10. August 2012 14:39
    Moderator
  • Danke!

    Montag, 13. August 2012 13:52
  • Hallo Dirk2006,

    Könntest Du Dein Problem lösen? Wenn ja, es wäre schön, wenn Du posten würdest wie es funktioniert hat, denn dann profitieren unter Umständen andere mit dem gleichen Problem davon.

    Grüße,

    Robert


    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Montag, 13. August 2012 14:36
    Moderator
  • Ich habe es mal auf eine andere Art probiert:

      private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
       
    {
           
    DataGrid dg = (DataGrid)sender;
           
    if (dg.SelectedItem == null) return;
            dg
    .ScrollIntoView(dg.SelectedItem);

           
    DataGridRow dg_row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromItem(dg.SelectedItem); // der Aufruf soll auch nicht immer funktionieren :-)

     
           
    if (dg_row == null) return;

    Ich arbeite aber eigentlich mit Visual Basic :-). 

    Melde mich, wenn es wirklich läuft.

    Dirk


    • Als Antwort markiert Dirk2006 Dienstag, 9. Oktober 2012 10:28
    Sonntag, 2. September 2012 16:40