将对象添加到数据表并创建动态网格视图
本文关键字:创建 动态 网格 视图 数据表 对象 添加 | 更新日期: 2023-09-27 17:55:30
我有很多这样的工作,并使用这种技术创建了一个下拉列表和一个树视图。一个 ajax 调用,用于动态创建控件,并将它们返回到使用 jqueryajax 和 C# 完全构造和配置的页面。但是我坚持从我的类对象创建一个数据表。该控件显然返回了一个双循环 gridView,我只希望它写出返回数据的视图,最终具有 gridView CRUD Ops 的所有优点。我做错了很简单,你能帮忙吗?
这是我用于创建网格视图的 C# 代码
[WebMethod]
public static AjaxReturnObject GetProductsByCategoryID(string CategoryID)
{
AjaxReturnObject o = new AjaxReturnObject();
int catID = Convert.ToInt32(CategoryID);
Product.ProductCollection products = new Product().GetProductsByCategoryID(catID);
if (products.Count == 0)
{
o.Message = "There was no data returned";
o.Status = 999;
return o;
}
else
{
// build a new GridView (or List View) for the UI and populate it with data.
// 1: Initialize a object of type DataTable.
DataTable dt = new DataTable();
//2: Initialize a object of type DataRow
DataRow drow;
//3: Initialize enough objects of type DataColumns
DataColumn col1 = new DataColumn("Product Name", typeof(string));
DataColumn col2 = new DataColumn("Product Description", typeof(string));
DataColumn col3 = new DataColumn("Price", typeof(string));
DataColumn col4 = new DataColumn("Col4", typeof(string));
//4: Adding DataColumns to DataTable dt
dt.Columns.Add(col1);
dt.Columns.Add(col2);
dt.Columns.Add(col3);
dt.Columns.Add(col4);
//5: Adding values in DataColumns
for (int i = 0; i < products.Count; i++)
{
foreach (Product item in products)
{
drow = dt.NewRow();
dt.Rows.Add(drow);
dt.Rows[i][col1] = item.ProductName.ToString();// i.ToString();
dt.Rows[i][col2] = item.ProductDescription.ToString();
dt.Rows[i][col3] = String.Format("{0:C}", item.Price);
dt.Rows[i][col4] = String.Format("{0:.00}", item.Price);
}
}
GridView GridView1 = new GridView();
GridView1.DataSource = dt;
GridView1.DataBind();
// Render the new control and return it to the Ajax Return Object
StringWriter tw = new StringWriter();
Html32TextWriter writer = new Html32TextWriter(tw);
GridView1.RenderControl(writer);
writer.Close();
o.Object = tw.ToString();
o.Message = "Result Data Message";
o.Status = 1;
return o;
}
}
}
虽然上面的答案是正确的。
但是更好的方法是编写将集合转换为DataTable的扩展方法,我们可以在应用程序中的任何位置使用它,我的项目中有一个用于将List<T>
转换为DataTable
。
事情是这样的:
public static class ListExtensions
{
public static DataTable ToDataTable<T>(this List<T> iList)
{
DataTable dataTable = new DataTable();
PropertyDescriptorCollection propertyDescriptorCollection =
TypeDescriptor.GetProperties(typeof(T));
for (int i = 0; i < propertyDescriptorCollection.Count; i++)
{
PropertyDescriptor propertyDescriptor = propertyDescriptorCollection[i];
Type type = propertyDescriptor.PropertyType;
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
type = Nullable.GetUnderlyingType(type);
dataTable.Columns.Add(propertyDescriptor.Name, type);
}
object[] values = new object[propertyDescriptorCollection.Count];
foreach (T iListItem in iList)
{
for (int i = 0; i < values.Length; i++)
{
values[i] = propertyDescriptorCollection[i].GetValue(iListItem);
}
dataTable.Rows.Add(values);
}
return dataTable;
}
}
只需以这种方式在任何List<T>
上使用它:
List<Product> products = new List<Product>();
DataTable dtProducts = products.ToDataTable();
我相信
你在循环中犯了一个错误
// remove that line
// for (int i = 0; i < products.Count; i++)
int i = 0;
{
foreach (Product item in products)
{
drow = dt.NewRow();
dt.Rows.Add(drow);
dt.Rows[i][col1] = item.ProductName.ToString();// i.ToString();
dt.Rows[i][col2] = item.ProductDescription.ToString();
dt.Rows[i][col3] = String.Format("{0:C}", item.Price);
dt.Rows[i][col4] = String.Format("{0:.00}", item.Price);
// and here move to next
i++;
}
}
您正在运行不必要的 foreach 循环。更改循环结构,如下所示:
//5: Adding values in DataColumns
for (int i = 0; i < products.Count; i++)
{
//foreach (Product item in products)
//{
Product item = products[i];
drow = dt.NewRow();
dt.Rows.Add(drow);
dt.Rows[i][col1] = item.ProductName.ToString();// i.ToString();
dt.Rows[i][col2] = item.ProductDescription.ToString();
dt.Rows[i][col3] = String.Format("{0:C}", item.Price);
dt.Rows[i][col4] = String.Format("{0:.00}", item.Price);
//}
}