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 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); 也是可以
但是我要加 [] ,在找不到怎麼加上去的情況下 先這樣吧



 









留言

熱門文章