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 に配置するときに列を自動生成したいと考えています。ただし、最初に共有基本クラスにある列を表示したいと思います。を GridView データソースに割り当てるIEnumerable<Data>と、基本クラスのプロパティが最後に 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 に答える