2016-05-22 17 views
0

私は数時間にわたり頭を悩ませて、何が原因であるか把握しようとしています。私はC#/ WPFのDataGridにアクセスするAccessデータベースを持っています。私は、DataGridにバインドされているDataContextにフィードするCollectionViewのページを設定するカスタムクラスに渡されたDataTableを使用しています。私はプログラムの起動からDataGridの描画までずっとこれをトレースしており、正しい数の行が常に存在しています(MessageBox.Show(CollectionView.Count.ToString())を使って確認しています)。 DataGridが描画された後でも正しい数の項目(200)があるので、Paginationクラスを実行した後にDataGridが項目を表示する方法でなければならないと思っていますが、どこか見つからないようです問題は、原因になる可能性があります。誰かがこのコードを見て、これを引き起こす可能性のあることに気づいたかどうかを確認できますか?重複する行を作成するDataContext/DataGrid

重複の表示に関するカップルノート:メソッド呼び出しのitemsPerPage値を変更すると、重複がどのように分離されるかが影響を受けます。 1ページあたり200件の場合、1つのグループに8つの重複があります。ページあたり100個の結果が得られた場合、1行の4つの複製が続き、4つの複製が続き、4つの複製が続き、最初の4つの複製が再度行われます。したがって、このような:

  • 200 itemsPerPage:CCCCCCCC BBBBBBBB AAAAAAAAは​​DDDDDDDD
  • 100 itemsPerPage:AAAA BBBB AAAA BBBB CCCC DDDD CCCC DDDD明らかにこれらの行なので、それらが代わりに下る

しかし、コンセプトはうまくいくはずです。

アップデート:私は前に言及するのを忘れてしまったが、ページネーションクラスは、この質問への答えのオフに基づいています。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のロード方法:(現在はinstruments DataGridのみページネーションを使用していますが、dialerRecordはありません。)

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); 
      } 
     } 
    } 

ページネーションクラスは

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

これを最初に試してみてください。このマークアップを取り除くAutoGeneratingColumn = "instrumentIdDataGrid_AutoGeneratingColumn" –

+0

マークアップを削除すると同じ問題が発生し、変更はありません。私はこれが問題かもしれないと思ったので、それが本当である前に 'AutoGenerateColumns'を' False'に変更したのです。当時はポジティブだったわけではありませんが、「False」に変更するとイベントが発生しなくなりました。確かにそれが事実であることを知ってうれしい、と私はまだ提案を感謝します!:) –

+1

これを試して、ページングを取り除き、楽器コレクションビューのコンテンツに直接バインドしてください。 –

答えて

0

は、だから、問題はタイプミスの簡単なケースだったようです。私が質問を反映するように更新したとき、私は以前の質問でPagingクラスを見つけました。どうやら私はそれをVisual Studioにコピーしたときに2つの方法を混在させていました。今後の参考として、以下の関連メソッドを投稿しています。

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; 
     } 
    } 

私はPageCount方法の内EndIndex方法のコンテンツを配置し、完全EndIndex方法を残していました。

関連する問題