3

我想知道 XtraGrid 和 BandedGrid 如何一起玩并绑定到底层数据。该 文档有一些解释性的 tl;dr-text 但我缺少一个完整的工作示例来在代码中设置它。所以我花了大约2个小时才弄清楚。基于此博客条目 ,我想在此处发布我的答案。

在此处输入图像描述

如果有更好的方法将各个部分放在一起,如下面的回答中所示,我很想知道。

4

1 回答 1

4

首先,您必须知道可以将普通 DataTable 绑定到 XtraGrid,并且带状网格的创建是独立的。

您可以在下面看到创建了一个新实例XtraGrid。它 MainView 设置为BandedGridView

private void LoadAndFillXtraGrid() // object sender, EventArgs e
{
    grid = new DevExpress.XtraGrid.GridControl(); 
    grid.Dock = DockStyle.Fill;                        
    // set the MainView to be the BandedGrid you are creating
    grid.MainView = GetBandedGridView();                
    // set the Datasource to a DataTable
    grid.DataSource = GetDataTable(); 
    // add the grid to the form      
    this.Controls.Add(grid);
    grid.BringToFront();
} 

在线上方grid.MainView = GetBandedGridView();设置一个 BandedGridView 作为 Xtragrid 的 MainView。下面你会看到如何创建这个 BandedGridView

//Create a Banded Grid View including the grindBands and the columns
private BandedGridView GetBandedGridView()
{                        
    BandedGridView bandedView = new BandedGridView();            
    // Set Customer Band
    SetGridBand(bandedView, "Customer", 
             new string[3] { "CustomerId", "LastName", "FirstName" });
    SetGridBand(bandedView, "Address", new string[3] { "PLZ", "City", "Street" });
    return bandedView;
}

要设置 GridBand,您必须创建一个 GridBand 并通过调用bandedView.Columns.AddField每列将其附加到 bandedGridView

private void SetGridBand(BandedGridView bandedView, string gridBandCaption
   , string[] columnNames)
{        
    var gridBand = new GridBand();
    gridBand.Caption = gridBandCaption;        
    int nrOfColumns = columnNames.Length;
    BandedGridColumn[] bandedColumns = new BandedGridColumn[nrOfColumns];            
    for (int i = 0; i < nrOfColumns; i++)
    {
        bandedColumns[i] = (BandedGridColumn)bandedView.Columns.AddField(columnNames[i]);
        bandedColumns[i].OwnerBand = gridBand;
        bandedColumns[i].Visible = true;
    }        
}

DataSource 可以是包含一些列的普通 DataTable。如果数据表中列的名称与 BandedGridColumn 的名称匹配,则将自动映射。如您所见,我在数据表中添加了一个NotMapped在上面的屏幕截图中不可见的列:

private DataTable GetDataTable()
{
    DataTable dt = new DataTable();
    dt.Columns.AddRange(new DataColumn[] { 
        new DataColumn("CustomerId", typeof(Int32)), 
        new DataColumn("NotMapped", typeof(Int32)), 
        new DataColumn("LastName", typeof(String)), 
        new DataColumn("FirstName", typeof(String)),
        new DataColumn("PLZ", typeof(Int32)),
        new DataColumn("City", typeof(String)),
        new DataColumn("Street", typeof(String))
    });
    dt.Rows.Add(1, 0, "John", "Barista", 80245, "Manhatten", "Broadway");
    dt.Rows.Add(2, 0, "Mike", "Handyman", 87032, "Brooklyn", "Martin Luther Drive");
    dt.Rows.Add(3, 0, "Jane", "Teacher", 80245, "Manhatten", "Broadway 7");
    dt.Rows.Add(4, 0, "Quentin", "Producer", 80245, "Manhatten", "Broadway 15");
    return dt;
}

如果有人有更优雅的方式将这些碎片组合在一起,我很想知道。

于 2013-05-23T14:59:15.773 回答