1

DataGridViewで、次のようにセルに値を割り当てています。

for (int i = 0; i < count; i++)
{
    int j = i + 1;
    DGVPointCtrl.Rows.Add(new DataGridViewRow());

    DGVPointCtrl.Rows[j].Cells["pointidentifier"].Value = pointCommonInfo[i].pointidentifier;
    DGVPointCtrl.Rows[j].Cells["pointname"].Value = pointCommonInfo[i].pointname;
    DGVPointCtrl.Rows[j].Cells["backup"].Value = pointCommonInfo[i].backup;
    DGVPointCtrl.Rows[j].Cells["covenable"].Value = pointCommonInfo[i].covenable;
    DGVPointCtrl.Rows[j].Cells["covlifetime"].Value = pointCommonInfo[i].covlifetime;
    DGVPointCtrl.Rows[j].Cells["covtarget"].Value = pointCommonInfo[i].covtarget;
    DGVPointCtrl.Rows[j].Cells["description"].Value = pointCommonInfo[i].description;
    DGVPointCtrl.Rows[j].Cells["historyenable"].Value = pointCommonInfo[i].historyenable;
    DGVPointCtrl.Rows[j].Cells["pointaddress"].Value = pointCommonInfo[i].pointaddress;
    DGVPointCtrl.Rows[j].Cells["pointtype"].Value = pointCommonInfo[i].pointtype;
    DGVPointCtrl.Rows[j].Cells["activetext"].Value = pointSpecificInfo[i].activetext;
    DGVPointCtrl.Rows[j].Cells["alarmenable"].Value = pointSpecificInfo[i].alarmenable;

    DGVPointCtrl.Rows[i].Cells["alarmenablehigh"].Value = pointSpecificInfo[i].alarmenablehigh;
    DGVPointCtrl.Rows[i].Cells["alarmenablelow"].Value = pointSpecificInfo[i].alarmenablelow;
    DGVPointCtrl.Rows[j].Cells["alarmvalue"].Value = pointSpecificInfo[i].alarmvalue;
    DGVPointCtrl.Rows[j].Cells["correctvalue"].Value = pointSpecificInfo[i].correctvalue;
    DGVPointCtrl.Rows[j].Cells["covincrement"].Value = pointSpecificInfo[i].covincrement;
    ...

かなり汚いもの。セル名はpointCommonInfoとpointSpecificInfoのリストのプロパティと一致するため、リフレクションを使用することにしました。

for (int i = 0; i < count; i++)
{
    int j = i + 1;
    DGVPointCtrl.Rows.Add(new DataGridViewRow());
    FieldInfo[] fieldCommon = typeof(PointCommonInformation).GetFields();
    FieldInfo[] fieldSpecific = typeof(PointSpecificInformation).GetFields();
    foreach (FieldInfo field in fieldCommon)
    {
        DGVPointCtrl.Rows[j].Cells[field.Name].Value = //?
    }

    foreach (FieldInfo field in fieldSpecific)
    {
        DGVPointCtrl.Rows[j].Cells[field.Name].Value = //?
    }   
}

フィールドの名前は取得できますが、リフレクションを使用して実際にアクセスする方法がわかりません。任意のガイダンスをいただければ幸いです。

4

2 に答える 2

2

セル名がpointCommonInfoおよびpointSpecificInfoのプロパティと一致すると言う場合は、GetFields()の代わりにGetProperties()を使用する必要があります。あなたは次のようにそれを達成することができます:

Type commonType = typeof(PointCommonInformation);

foreach (PropertyInfo item in commonType.GetProperties())
{
        object propertyObject = item.GetValue(pointCommonInfo, null);
        string propertyValue = propertyObject == null ? string.Empty : propertyObject.ToString();
        DGVPointCtrl.Rows[j].Cells[item.Name].Value = propertyValue;    
}
于 2012-09-17T04:25:42.793 に答える
1

FieldInfo.GetValueメソッドを使用するだけです:http: //msdn.microsoft.com/en-us/library/system.reflection.fieldinfo.getvalue.aspx

foreach (FieldInfo field in fieldCommon)
{
    DGVPointCtrl.Rows[j].Cells[field.Name].Value = field.GetValue(pointCommonInfo[i]);
}

foreach (FieldInfo field in fieldSpecific)
{
    DGVPointCtrl.Rows[j].Cells[field.Name].Value = field.GetValue(pointCommonInfo[i]);
}  
于 2012-09-17T04:18:36.730 に答える