2016-05-22 14 views
0

Ich habe mir mehrere Stunden lang den Kopf zerbrochen, um herauszufinden, was das verursacht. Ich habe eine Access-Datenbank, die ein DataGrid in C#/WPF füttert. Ich verwende eine DataTable, die in eine benutzerdefinierte Klasse für die Paginierung einer CollectionView eingegeben wird, die in einen DataContext geleitet wird, der an das DataGrid gebunden ist. Ich habe dies vom Programmstart bis zum Zeichnen des DataGrids verfolgt und die korrekte Anzahl von Zeilen ist immer vorhanden (mit MessageBox.Show (CollectionView.Count.ToString()), um es zu verifizieren). Es gibt eine korrekte Anzahl von Elementen (200), selbst nachdem das DataGrid gezeichnet wurde. Daher denke ich, dass es etwas daran sein muss, wie das DataGrid die Elemente anzeigt, nachdem sie durch die Paginierungsklasse ausgeführt wurden, aber ich finde keinen Ort Das Problem könnte von. Könnte sich jemand diesen Code ansehen und sehen, ob er etwas bemerkt, das das verursachen könnte?DataContext/DataGrid Erstellen von Duplikatzeilen

Ein paar Hinweise auf der Anzeige der Duplikate: Wenn ich den Wert itemsPerPage im Methodenaufruf ändert, beeinflusst es, wie die Duplikate getrennt werden. Wenn es 200 pro Seite ist, gibt es 8 Duplikate in einer Gruppe. 100 pro Seite ergeben 4 Duplikate einer Zeile, gefolgt von 4 weiteren, dann wieder 4 der ersten. So wie folgt aus:

  • 200 ItemsPerPage: AAAAAAAA bbbbbbbb cccccccc dddddddd
  • 100 ItemsPerPage: aaaa bbbb aaaa bbbb cccc dddd cccc dddd

Offensichtlich diese Zeilen sind, so dass sie nach unten gehen, anstatt auf die links, aber das Konzept sollte hoffentlich klar sein.

Update: Ich habe vergessen, bevor zu erwähnen, aber die Paginierung Klasse basiert eine Antwort auf diese Frage ab: How can I paginate a WPF DataGrid?

Datagrid XAML:

<DataGrid x:Name="instrumentIdDataGrid" ColumnWidth="Auto" ColumnHeaderStyle="{StaticResource datagridCenterHeaderStyle}" CellStyle="{StaticResource datagridCenterCellStyle}" 
         HorizontalAlignment="Stretch" HorizontalContentAlignment="Center" Margin="5,5,5,5" AutoGenerateColumns="False" Padding="10" 
         AutoGeneratingColumn="instrumentIdDataGrid_AutoGeneratingColumn" ItemsSource="{Binding}"> 
         <DataGrid.Columns> 
          <DataGridTextColumn Header="Agent TID" Binding="{Binding AgentTID}" /> 
          <DataGridTextColumn Header="Last Name" Binding="{Binding LastName}" /> 
          <DataGridTextColumn Header="First Name" Binding="{Binding FirstName}" /> 
          <DataGridTextColumn Header="Team" Binding="{Binding Team}" /> 
          <DataGridTextColumn Header="Instrument ID" Binding="{Binding InstrumentID}" /> 
          <DataGridTextColumn Header="On-Dialer" Binding="{Binding OnDialerExtension}" /> 
          <DataGridTextColumn Header="Off-Dialer" Binding="{Binding OffDialerExtension}" /> 
         </DataGrid.Columns> 
        </DataGrid> 

Datatable Lademethoden: (Nur das instruments DataGrid verwendet jetzt die Seitennummerierung, dialerRecords funktioniert nicht und ist in Ordnung.)

private void InitializeDataTables() 
    { 
     FillDataTable(dialerRecords, @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + backendFilePath + ";User Id=;Password=;", "SELECT * FROM DialerRecords"); 
     FillDataTable(instruments, @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + backendFilePath + ";User Id=;Password=;", "SELECT * FROM InstrumentIDs"); 

     this.instrumentCollectionView = new PagingCollectionView(instruments.DefaultView, 20); 

     instrumentIdDataGrid.DataContext = instrumentCollectionView; 
     dialerRecordsDataGrid.DataContext = dialerRecords.DefaultView; 
    } 

private void FillDataTable(System.Data.DataTable table, string connectionString, string queryString) 
    { 
     using (OleDbConnection connection = new OleDbConnection(connectionString)) 
     { 
      connection.Open(); 

      using (OleDbDataAdapter adapter = new OleDbDataAdapter(queryString, connection)) 
      { 
       adapter.Fill(table); 
      } 
     } 
    } 

Paginierung Klasse

public class PagingCollectionView : ListCollectionView 
{ 
    private readonly IList _innerList; 
    private readonly int _itemsPerPage; 

    private int _currentPage = 1; 

    public PagingCollectionView(IList innerList, int itemsPerPage) : base(innerList) 
    { 
     this._innerList = innerList; 
     this._itemsPerPage = itemsPerPage; 
    } 

    public override int Count 
    { 
     get 
     { 
      if (this._innerList.Count == 0) 
       return 0; 
      if(this._currentPage < this.PageCount) 
      { 
       return this._itemsPerPage; 
      } 
      else 
      { 
       int itemsLeft = this._innerList.Count % this._itemsPerPage; 
       if (0 == itemsLeft) 
       { 
        return this._itemsPerPage; 
       } 
       else 
       { 
        return itemsLeft; 
       } 
      }     
     } 
    } 

    public int CurrentPage 
    { 
     get { return this._currentPage; } 
     set 
     { 
      this._currentPage = value; 
      this.OnPropertyChanged(new PropertyChangedEventArgs("CurrentPage")); 
     } 
    } 

    public int ItemsPerPage 
    { 
     get 
     { 
      return this._itemsPerPage; 
     } 
    } 

    public int PageCount 
    { 
     get 
     { 
      int end = this._currentPage * this._itemsPerPage - 1; 
      return (end > this._innerList.Count) ? this._innerList.Count : end; 
     } 
    } 

    private int StartIndex 
    { 
     get 
     { 
      return (this._currentPage - 1) * this._itemsPerPage; 
     } 
    } 

    public override object GetItemAt(int index) 
    { 
     int offset = index & (this._itemsPerPage); 
     return this._innerList[this.StartIndex + offset]; 
    } 

    public void MoveToNextPage() 
    { 
     if (this._currentPage < this.PageCount) 
     { 
      this.CurrentPage += 1; 
     } 
     this.Refresh(); 
    } 

    public void MoveToPreviousPage() 
    { 
     if(this._currentPage > 1) 
     { 
      this.CurrentPage -= 1; 
     } 
     this.Refresh(); 
    } 
} 
+2

Versuchen Sie dies zuerst, nur um zu sehen, was passiert. Entfernen Sie dieses Markup AutoGeneratingColumn = "instrumentIdDataGrid_AutoGeneratingColumn" –

+0

Das Entfernen des Markups führte zum gleichen Problem, keine Änderung. Ich vermutete, dass dies das Problem sein könnte, daher der Grund, warum ich "AutoGenerateColumns" auf "False" geändert hatte, während es zuvor wahr war. Ich war zu der Zeit nicht positiv, aber ich dachte, dass die Änderung auf "False" verhindern würde, dass das Ereignis ausgelöst wird. Definitiv nett zu wissen, dass das der Fall ist, und ich schätze den Vorschlag trotzdem!:) –

+1

Ok, versuche das, entferne das Paging und binde direkt auf den Inhalt der Instrumentensammlungsansicht. –

Antwort

0

So scheint es, das Problem ein einfacher Fall von Tippfehler war. Als ich die Frage aktualisiert habe, habe ich die Paging-Klasse in einer früheren Frage gefunden. Anscheinend, als ich es in Visual Studio kopierte, mischte ich zwei Methoden, und das verursachte irgendwie das Problem. Für zukünftige Referenz, posten ich die relevanten Methoden unten.

public int PageCount 
    { 
     get 
     { 
      return (this._innerList.Count + this._itemsPerPage - 1)/this._itemsPerPage; 
     } 
    } 

    public int EndIndex 
    { 
     get 
     { 
      int end = this._currentPage * this._itemsPerPage - 1; 
      return (end > this._innerList.Count) ? this._innerList.Count : end; 
     } 
    } 

I hatte den Inhalt der EndIndex Methode innerhalb des PageCount Verfahrens platziert, und verließ die EndIndex Verfahren vollständig aus.