C# EasyUI datagrid 動態生成欄位 的方式
目前用 easyui-datagrid 須回傳 資料欄位
我是用 Class 包起來 用 list<> 做成資料
再用 return Json(Class) 轉成 JSON回傳 給前台 EasyUI
前台 開頭的欄位 就是 HTML 內 固定好的
一般這樣處理就解決 99%
但目前 碰到一個 資料欄位 是 變動的...
如果只是 少數幾個欄位
還可以先都傳回 前台 再用 jquery 隱藏的方式解決
問題是 這次的變動 是連我都無法確定有多少欄位
所以想在程式內 動態加入
***********************************
問題來了 C# 類別裏頭的欄位 可以讓你讀
例如:
class Mytest {
public string aa;
public string bb;
}
private void button1_Click(object sender, EventArgs e)
{
FieldInfo[] myFieldInfo;
Type myType = typeof(Mytest);
// Get the type and fields of FieldInfoClass.
myFieldInfo = myType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance
| BindingFlags.Public);
}
用這方式 可 取得 class 內 欄位名稱
但是查老半天卻找不到可新增 類別(class) 欄位名稱
一堆都說是做不到
好不容易查到
dynamic
這東西 看起來是可以動態加欄位
//將boo建立成ExpandoObject
dynamic boo = new ExpandoObject();
//直接寫boo.Name加上新的Property
boo.Name = "Jeffrey";
是可加欄位
但是 轉 json 出來的格式 卻跟我想的不一樣
看來是不行用了
後來想回來乖乖 的用
JObject jo = new JObject();
jo.Add(new JProperty("n", 32767));
這樣自己慢慢湊不小心看到 黑暗大大的
使用dynamic簡化Json.NET JObject操作
最後有個方法
dynamic dyna = new JObject();
dyna.n = 32767;
延伸一下
List<dynamic> dlist = new List<dynamic>();
for(int i = 1; i < 3; i++)
{
dynamic dyna = new JObject();
dyna.id = i;
dlist.Add(dyna);
}
string ss= JsonConvert.SerializeObject(dlist);
這樣就比較簡單 生成 前端要的 JSON 了
簡單是簡單 但是 如果是 要生成 以下格式
尤其是 rows 需用到 JArray
json = {{
"total": 100,
"rows": [
{
"id": 1,
"val": "VV1"
},
{
"id": 2,
"val": "VV2"
}
]
}}
上頭就沒辦法,於是就得改用
dynamic MyGrid_List= new JObject();
MyGrid_List.total = 100;
MyGrid_List.rows= new JArray();
for (int i = 1; i < 3; i++)
{
dynamic dyna = new JObject();
dyna.id = i;
dyna.val = "VV" + i;
MyGrid_List.rows.Add(dyna);
}
string str = JsonConvert.SerializeObject(MyGrid_List);JObject json = JObject.Parse(str);
XD 搞老半天我是 "名稱" 需要會變動的 ...........
所以又改成
dynamic MyGrid_List = new JObject();
MyGrid_List.total = 100;
MyGrid_List.rows= new JArray();
for (int i = 1; i < 3; i++)
{
JObject mark = new JObject { { "id", i }, { "val", "VV" + i } };
MyGrid_List.rows.Add(mark);
}
上頭是好用一點 但總覺得還不如用回以下
JObject MyGrid_List = new JObject {
{ "total", 100 },
{ "rows",new JArray() }
};
for (int i = 1; i < 3; i++)
{
JObject ja = new JObject();
ja.Add(new JProperty("id",i));
ja.Add(new JProperty("val", "VV" + i));
((JArray)MyGrid_List.GetValue("rows")).Add(ja);
}
單純用 JObject 處理掉
然後就是 easyui-datagrid columns 欄位抬頭設定問題
在後台用C#
JArray DbFields = new JArray();
DbFields.Add(new JObject { { "field", "REC_NO" }, { "width", "10%" }, { "title", "資料編號" }, { "align", "center" } });
在送回JS不能用 比對半天
JS 看到 easyUI json 格式是 [[...]]
而我轉出來的卻是[...] easyUI 它多了一層
剛開始用 Jobject 搞不懂 怎麼加個[]在上一層
最後用偷雞方式 先傳回 字串 [...]
Data_field_Json = JSON.parse("["+rdata+"]");
自己偷加 [] 再轉就 OK 了
***************************
ps:formatter 功能加不上去 真的要的話
改用 拚湊 hrml 的方式 貼到 html 上
不要用 JSON 的方式
*******************************
注意:
View 怎麼 return json 有差
例如:
JArray DbFields = new JArray();
之後 轉成 字串
string str = JsonConvert.SerializeObject(DbFields);
這時 如果是用 return Json(str);
這時 JS 收到的是字串 就要 轉JSON
Data_field_Json = JSON.parse("["+rdata+"]");
如果view 是用
return Content("["+str+"]", "application/json");
Data_field_Json = rdata;//就可直接當 一個 JSON Object 收
這兩種差異 要小心
當然直接 return Json(DbFields); 也是可以
但是我要加 [] ,在找不到怎麼加上去的情況下 先這樣吧
留言
張貼留言