0

必要な方法でデータをフォーマットするカスタムデータ型クラスを作成しました。データベースから取得するデータは.NETベースタイプとして提供されるため、DataTableをループして、各アイテムをカスタムタイプに変換し、変換されたアイテムを新しいテーブルに配置する必要があります。また、古いテーブルから新しいテーブルに列名をコピーします。問題は、GridViewを新しいテーブルにバインドすると、例外がスローされることです。

HttpException:  
The data source for GridView with id 'TestGrid' did not have any properties
or attributes from which to generate columns.  Ensure that your data source 
has content.  

Stack Trace:
at System.Web.UI.WebControls.GridView.CreateAutoGeneratedColumns(PagedDataSource dataSource)
at System.Web.UI.WebControls.GridView.CreateColumns(PagedDataSource dataSource, Boolean useDataSource)
at System.Web.UI.WebControls.GridView.CreateChildControls(IEnumerable dataSource, Boolean dataBinding)
at System.Web.UI.WebControls.CompositeDataBoundControl.PerformDataBinding(IEnumerable data)
at System.Web.UI.WebControls.GridView.PerformDataBinding(IEnumerable data)
at System.Web.UI.WebControls.DataBoundControl.OnDataSourceViewSelectCallback(IEnumerable data)
at System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback)
at System.Web.UI.WebControls.DataBoundControl.PerformSelect()
at System.Web.UI.WebControls.BaseDataBoundControl.DataBind()
at System.Web.UI.WebControls.GridView.DataBind()

autogeneratecolumnsを機能させるには、DataTableに何を追加する必要がありますか?

編集:DataTableのコードは次のとおりです。

     // Populate first DataTable with data from database.
     adapter = new DataAdapter("SELECT status, date_ordered, date_due FROM import_table", OpenConnection);
     DataTable originalTable = new DataTable();
     adapter.Fill(originalTable)

     // Second DataTable for converted table data.
     DataTable convertedTable = new DataTable();

     // The list of custom datatypes to convert to.
     Type[] newTypes = {typeof(TrackingStatus), typeof(Date), typeof(Date)};

     // Set the ColumnName and DataType on each column of the new table.
     for(int i = 0; i < originalTable.Columns.Count; i++)
     {
        convertedTable.Columns.Add();
        convertedTable.Columns[i].ColumnName = originalTable.Columns[i].ColumnName;
        if(newTypes.Length > i)
           convertedTable.Columns[i].DataType = newTypes[i];
     }

     // Convert each item from the old table and add it to the new table.
     foreach(DataRow oldRow in originalTable.Rows)
     {
        DataRow newRow = convertedTable.NewRow();

        for(int i = 0; i < convertedTable.Columns.Count; i++)
        {
           if(newTypes.Length <= i)
              newRow[i] = oldRow[i];
           else if(newTypes[i] == typeof(Date))
              newRow[i] = Date.FromObject(oldRow[i]);
           else if(newTypes[i] == typeof(TrackingStatus))
              newRow[i] = TrackingStatus.FromObject(oldRow[i]);
           else if(newTypes[i] == typeof(EmailAddress))
              newRow[i] = EmailAddress.FromObject(oldRow[i]);
        }

        convertedTable.Rows.Add(newRow);
     }

     // Bind the GridView.
     displayGrid.DataSource = convertedTable;
     displayGrid.DataBind();
4

2 に答える 2

1

それぞれをカスタムタイプに変換するときに新しいデータテーブルを作成する代わりに、新しいリストを作成し、リストをデータソースにバインドします。例えば

var list = new List<MyClass>();

var myType = //Convert your type
list.Add(myType);

grid.DataSource = list;

そしてもちろん、これはすべてそれを行う方法の単なるアイデアです。

更新:後でコードを見ました:

これを試して:

ImportRowというクラスを作成します

class ImportRow
{
    private string m_Status = string.Empty;
    private DateTime m_DateOrdered;
    private DateTime m_DateDue;

    public ImportRow() { }

    public string Status
    {
        get { return m_Status; }
        set { m_Status = value; }
    }

    public DateTime DateOrdered
    {
        get { return m_DateOrdered; }
        set { m_DateOrdered = value; }
    }

    public DateTime DateDue
    {
        get { return m_DateDue; }
        set { m_DateDue = value; }
    }

}

次に、次のように使用します。

        var importedData = new List<ImportRow>();

        foreach (DataRow oldRow in originalTable.Rows)
        {
            var newRow = new ImportRow();

            newRow.Status = oldRow["status"].ToString();
            newRow.DateDue = Convert.ToDateTime(oldRow["date_due"].ToString());
            newRow.DateOrdered = Convert.ToDateTime(oldRow["date_ordered"].ToString());

            importedData.Add(newRow);
        }

それで

 displayGrid.DataSource = importedData;
 displayGrid.DataBind();
于 2012-12-07T16:37:50.790 に答える
1

カスタムタイプには、次のようなパブリックプロパティが必要です。

public class Foo
{
    public int Id;
    public string Name;
}

DataTableまたは、それ自体をとして使用する必要がありますDataSource

于 2012-12-07T16:31:00.153 に答える