Pickle 教授、ご回答ありがとうございます。
これが私がやったことです。グリッドデータの読み込み方法は以下の通りです。
public ActionResult GetProductDetailsGrid([DataSourceRequest] DataSourceRequest request)
{
try
{
List<ProductDetails> productDetails = null;
//IEnumerable<ProductDetails> productDetails = null;
if (SessionRepository.VerifySessionExists(ApplicationConstants.sesProductDetails))
{
productDetails = SessionRepository.GetSessionObject<List<ProductDetails>>(ApplicationConstants.sesProductDetails).ToList(); //.AsEnumerable();
//Return converted list<T> as DataTable
var dataTable = ToDataTable<ProductDetails>(productDetails);
if (dataTable != null)
{
var dataColumnCollection = dataTable.Columns;
SessionRepository.CacheSession<DataColumnCollection>(ApplicationConstants.sesAcquireStockDataColumnCollection, dataColumnCollection);
}
return Json(dataTable.ToDataSourceResult(request));
}
}
catch (Exception ex)
{
ModelState.AddModelError("", ex.Message);
return Json(ModelState.ToDataSourceResult());
}
return Json(ModelState.ToDataSourceResult(request));
}
私のモデルは
public class ProductDetails
{
[Key,ScaffoldColumn(false)]
public long ProductDetailId { get; set; }
public int ProductHeaderId { get; set; }
public double Amount { get; set; }
public string Value { get; set; }
public string Value1 { get; set; }
public string Value2 { get; set; }
public string Value3 { get; set; }
public string Value4 { get; set; }
public string Value5 { get; set; }
public string Value6 { get; set; }
public string Value7 { get; set; }
public string Value8 { get; set; }
public string Value9 { get; set; }
public string Value10 { get; set; }
public string Value1DisplayName {get; set;}
public bool Valid { get; set; }
}
ビューが表示される前に、セッションが null でない場合はデータをグリッドに渡します。それ以外の場合は、以下に示すようにビューに何も渡しません。
public ActionResult AcquireStock()
{
//TODO uncomment the Session Below
//SessionRepository.RemoveSession(ApplicationConstants.sesProductDetails);
var productHeader = new ProductHeaders();
if (SessionRepository.VerifySessionExists(ApplicationConstants.sesProductDetails))
{
var productDetails = SessionRepository.GetSessionObject<List<ProductDetails>>(ApplicationConstants.sesProductDetails).ToList(); //.AsEnumerable();
//Return converted list<T> as DataTable
var dataTable = ToDataTable<ProductDetails>(productDetails);
if (dataTable != null)
{
productHeader.ProductDetailsDataTable = dataTable;
//SessionRepository.CacheSession<DataColumnCollection>(ApplicationConstants.sesAcquireStockDataColumnCollection, dataColumnCollection);
}
return View(productHeader);
}
productHeader.ProductDetailsDataTable = null;
return View(productHeader);
}
モデルプロパティのすべての値を表示することなく、列名と行をそれぞれ渡すことで、データをデータテーブルに変換するジェネリックメソッドを作成しました。「」またはnullではない値を持つフィールドを渡したいです。グリッドに表示されるようにします。私の一般的な方法は次のとおりです。
//Converts Generic List to DataTable
private DataTable ToDataTable<T>(List<T> data)// T is any generic type
{
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T));
int columnCount = 0;
DataTable table = new DataTable();
var colums = rtxVending.Web.Repositories.SessionRepository.GetSessionObject<IList<rtxVending.Web.Models.ProductCategoryTags>>(ApplicationConstants.sesProductsHeaderCategoryTags);
if (colums != null && colums.Count > 0)
{
var columnName = colums.Select(a => a.ValueX).ToArray();
for (int i = 0; i < columnName.Count(); i++)
{
table.Columns.Add(columnName[i]);
}
columnCount = columnName.Count();
}
else
{
for (int i = 0; i < props.Count; i++)
{
PropertyDescriptor prop = props[i];
table.Columns.Add(prop.Name, prop.PropertyType);
}
}
object[] values = new object[props.Count];
foreach (T item in data)
{
for (int i = 0; i < values.Length; i++)
{
values[i] = props[i].GetValue(item);
}
object[] newValues = new object[columnCount];
int j = 0;
foreach (var p in values)
{
Type argType = p.GetType();
if (argType == typeof(bool) && !((bool)p))
{
newValues[j] = p;
j++;
}
else if(argType == typeof(int) && (int)p != 0)
{
newValues[j] = p;
j++;
}
else if (argType == typeof(double) && (double)p != 0)
{
newValues[j] = p;
j++;
}
else if (argType == typeof(string) && p != null && p != string.Empty)
{
newValues[j] = p;
j++;
}
if (j >= columnCount)
break;
}
//table.Rows.Add(values);
//table.Rows.Add(newValues);
}
return table;
}
私のグリッドは今これです
@(Html.Kendo()
//.Grid<rtxVending.Web.Models.ProductDetails>()
.Grid(Model.ProductDetailsDataTable)
.Name("ProductDetailGrid")//.ClientDetailTemplateId("")
.HtmlAttributes(new { @style = "align:center; font-size:9px;" })
.Columns(columns =>
{
//var columnData = rtxVending.Web.Repositories.SessionRepository.GetSessionObject<System.Data.DataColumnCollection>(ApplicationConstants.sesAcquireStockDataColumnCollection);
//if(columnData != null && columnData.Count > 0)
if (Model.ProductDetailsDataTable != null)
foreach (System.Data.DataColumn column in Model.ProductDetailsDataTable.Columns)
{
columns.Bound(column.ColumnName);
}
})
.Pageable(pager => pager.Refresh(true))
.Sortable()
.Scrollable()
.DataSource(dataSource => dataSource
.Ajax()
.Read(read => read.Action("GetProductDetailsGrid", "Products"))
.Model(model =>
{
if (Model.ProductDetailsDataTable != null)
foreach (System.Data.DataColumn column in Model.ProductDetailsDataTable.Columns)
{
model.Field(column.ColumnName, column.DataType);
}
})
.Events(events => events.Error("error_handler"))) )
説明しなければならないことがあれば、できるだけ早く対応します。ピクルス先生ありがとう!