0

首先让我说我在 StackOverflow 上看到过类似的问题,但我没有看到专门处理自动生成的列。

我有一个asp:GridView绑定到一个 的IEnumerable<Data>,其中Data可能因运行时输入而异。但是,每个Data类都有几个基本属性:

public class BaseData
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public class AddressData : BaseData
{
    public string Street1 { get; set; }
    public string Street2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string ZipCode { get; set; };
}

public class ContactData : BaseData
{
    public string Phone { get; set; }
    public DateTime LastUpdated { get; set; }
    // tons more public properties...
}

// More classes with lots of different public properties...

这些不同的类由数据库查询填充,因此当我将数据放入 GridView 时,我想自动生成列,因为有大量不同的字段。但是,我想首先显示共享基类中的列。如果我只是将 分配IEnumerable<Data>给 GridView 数据源,则基类属性将最后添加到 GridView 的列中。我尝试纠正这种情况:

// Callback after getting data from database
public void SetGridView<Data>(IEnumerable<Data> rows) where Data : BaseData
{
    // Make sure these columns show up first
    BoundField ID = new BoundField() { HeaderText = "ID", DataField = "ID" };
    BoundField Name = new BoundField() { HeaderText = "Name", DataField = "Name" };
    myGridView.Columns.Clear();
    myGridView.Columns.Add(ID);
    myGridView.Columns.Add(Name);
    myGridView.AutoGenerateColumns = true;
    myGridView.DataSource = rows;
    myGridView.DataBind();
}

但是,这只是复制了开头和结尾的列,因此标题如下所示:

ID    Name    Street1    Street2    City    State    ZipCode    ID    Name

那么有没有办法让我将我知道将存在的列(基类)移动到 GridView 列的开头,同时仍然可以方便地自动生成所有其他列?

4

1 回答 1

1

由于您被迫使用自动生成的列,我只需创建一个中间体DataTable来将 GridView 绑定到。在该DataTable对象中,您可以按您喜欢的顺序添加列。然后 GridView 应该以相同的顺序绑定。

编辑:修改BaseData,添加以下内容:

private DataTable dataForDisplay;

// This would be overridden by all child classes, adding their columns in the order you want
public virtual DataTable GetDataForDisplay()
{
    dataForDisplay = new DataTable();
    dataForDisplay.Columns.Add("ID");
    dataForDisplay.Columns.Add("Name");
    // If you want to change the order, just don't call the base.GetDataForDisplay()

    dataForDisplay.Rows.AddRange(this.ID, this.Name);

    return dataForDisplay;
}

然后所有其他子类将覆盖GetDataForDisplay().

于 2013-10-01T16:27:25.907 回答