私は以下のようなコードを持っています。コードは、DataGridView.DataSource
に入り、EPPlus
を使用してulitmatelyし、Excelファイルにデータを出力します。私の質問は、共分散とその使い方に関するものだと私は思います。共分散を持つDataGridView?
DataSource
で見つかったタイプに基づいて、newList
が作成されています。次に、このタイプに固有のプロパティ、someClassObject.Name, .Address and .Phone
を使用してデータを追加します。
私の問題は、DataGridView
パラメータで渡すことができる約75種類のクラスがあることです。指定されたDataGridView.DataSource
のすべてのオブジェクトは同じクラスですが、各クラスは固有のプロパティを持ちます(つまり、名前、住所、電話である必要はありません)。
type.FullName
に基づくスイッチステートメントをとすることができ、各セルにプロパティ値を割り当てるための独自のforループがあります。それはうまくいくが、信じられないほど厄介なことになるだろう。これを行うより良い方法はありますか?代わりに、この関数内DataRow
作成を行うの
public void openExcelReport(ref DataGridView dataGridView, bool bolSave = false, bool bolOpen = true, string pageTitle = "EXPORTED DATA")
{
// put dataGridView.DataSource into a List
object firstItem = null;
var myDataSource = dataGridView.DataSource;
var myList = ((System.Windows.Forms.BindingSource)dataGridView.DataSource).List;
firstItem = ((System.Collections.IList)myList)[0];
var type = firstItem.GetType();
Type PROJECT1_TYPE = typeof(Project1.SomeClass);
Type PROJECT2_TYPE = typeof(Project2.SomeOtherClass); // many more of these
dynamic newList = null;
if (type.FullName.Equals(PROJECT1_TYPE.FullName))
{
newList = new List<Project1.SomeClass>();
foreach (Project1.SomeClass someClassObject in myList)
{
newList.Add(someClassObject);
}
}
ExcelPackage package = new ExcelPackage();
using ((package)) // use EPPlus
{
// Create the worksheet
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Worksheet 1");
// Load the datatable into the sheet, starting from cell A1. Print the column names on row 1
System.Data.DataTable dataTable = new System.Data.DataTable();
dataTable.Columns.Add("Id");
dataTable.Columns.Add("FirstColumn", typeof(string));
dataTable.Columns.Add("SecondColumn", typeof(string));
dataTable.Columns.Add("ThirdColumn", typeof(string));
dataTable.Columns[0].AutoIncrement = true;
var column_id = 0;
foreach (Project1.SomeClass someClassObject in "FirstColumn")
{
DataRow dataRow = dataTable.NewRow();
dataRow["FirstColumn"] = someClassObject.Name;
dataRow["SecondColumn"] = someClassObject.Address;
dataRow["ThirdColumn"] = someClassObject.Phone
dataTable.Rows.Add(dataRow);
column_id += 1;
}
// worksheet is now populated, so save Excel File
...
}
あなたが渡しているクラスでは、 'GetDataRow()'(またはそれに類似した)関数を持つインターフェースを実装して、クラス実装自体にそのコードを持つことができるようにすることができますか?ここでは単に 'dataTable.Rows.Add(someClassObject.GetDataRow())'を実行します。そしてそれでやります。これは 'switch'または' if/else'ブロックを必要としないようにします。なぜなら、 'DataRow'を生成するための詳細は、対象となる列を含むクラスにプロパティとして直接関連付けられているからです。 – gmiley