FineUI 官方论坛

标题: DataGrid中,使用DropDownList多选数据,保存时出错。 [打印本页]

作者: presun    时间: 2015-8-10 18:00
标题: DataGrid中,使用DropDownList多选数据,保存时出错。
在DataGrid中,其中的一列是要从多个值中选取(可以多选),此列使用RenderField,Editor是一个DropDownList,DropDownList的数据源是List<string>类型,在初始显示时正确,当鼠标点击,进入编辑状态时,DropDownList没有根据单元格的值自动选中,再重新选择项,保存数据,报错:Cannot cast Newtonsoft.Json.Linq.JArray to Newtonsoft.Json.Linq.JToken。


石上能帮我看看什么问题不?

作者: presun    时间: 2015-8-10 18:03
堆栈信息:
[InvalidCastException: Cannot cast Newtonsoft.Json.Linq.JArray to Newtonsoft.Json.Linq.JToken.]
   Newtonsoft.Json.Linq.Extensions.Convert(T token) +621
   Newtonsoft.Json.Linq.JToken.Value(Object key) +133
   FineUI.Grid.LoadPostData(String postDataKey, NameValueCollection postCollection) +1824
   System.Web.UI.Page.ProcessPostData(NameValueCollection postData, Boolean fBeforeLoad) +734
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1960
作者: presun    时间: 2015-8-12 08:33
问题已找到,在Grid的LoadPostData方法中,如果数据是多选的,其类型是JArray,无法直接转换成JValue,所以,要先JArray中的值拼成一个,在原来的程序中,没有处理JArray的情况,二是将值直接转换,导致的此问题。修改代码如下3731行开始:
  1. Dictionary<string, object> rowModifiedDic = new Dictionary<string, object>();
  2.                         JObject rowModifiedData = modifiedItem[2].ToObject<JObject>();
  3.                         object cellValue = null;
  4.                         foreach (JProperty propertyObj in rowModifiedData.Properties())
  5.                         {
  6.                             string columnID = propertyObj.Name;
  7.                             //==处理可以多选的情况
  8.                             JArray jarr = rowModifiedData[columnID] as JArray;
  9.                             if (jarr != null)
  10.                             {
  11.                                 string value="";
  12.                                 foreach (var item in jarr)
  13.                                 {
  14.                                     value += "," + item;
  15.                                 }
  16.                                 if(value.Length >1)
  17.                                     value = value.Substring(1);
  18.                                 cellValue = value;
  19.                             }
  20.                             else
  21.                                 cellValue = rowModifiedData.Value<JValue>(columnID).Value;
  22.                             //===处理多选结束
复制代码

作者: presun    时间: 2015-8-12 08:34
不知道如何获取是否是多选的属性(如果可以的话,效率应该会好些),所以,直接对类型进行转换,如果不成功,则说明是单选。
作者: stevezozo    时间: 2015-8-12 15:43
受教了




欢迎光临 FineUI 官方论坛 (https://fineui.com/bbs/) Powered by Discuz! X3.4