FineUI 官方论坛

标题: 强列建议将下一个版本的Grid,TemplateField修改回3.1.3版本的源 [打印本页]

作者: 七色北斗星    时间: 2012-8-1 08:12
标题: 强列建议将下一个版本的Grid,TemplateField修改回3.1.3版本的源
本帖最后由 七色北斗星 于 2012-8-1 08:13 编辑

强列建议将3.1.8的Grid,TemplateField修改回3.1.3版本的源码
因为我系统内的角色权限配置用的是Grid,TemplateField,CheckBoxList控件,
3.1.3的后台取值是通过Request.Form.AllKeys获取的,CheckBoxList内的每一个单个控件都会生成一个key("Grid1_0$cbList$0","Grid1_0$cbList$1","Grid1_0$cbList$2","Grid1_1$cbList$0","Grid1_1$cbList$1","Grid1_1$cbList$2"),这样可以取出2行3列的值。
3.1.8的通过Request.Form.AllKeys获取的值是("Panel1$Grid1$c1r7$cbList$0","Panel1$Grid1$c1r7$cbList$1"),只能取出两列,里面的子项是无法获取到的。

以下是两个版本的参照对比,从3.1.4一直到3.1.8都是不能用的,或许是我没找到新版的取值方法,如果有谁能取到新版的值请不吝赐教。
3.1.3版的
  1.         internal override string GetColumnValue(GridRow row)
  2.         {
  3.             string result = String.Empty;

  4.             if (_itemTemplate != null)
  5.             {
  6.                 StringBuilder output = new StringBuilder();
  7.                 using (StringWriter sw = new StringWriter(output, CultureInfo.CurrentCulture))
  8.                 {
  9.                     using (HtmlTextWriter htw = new HtmlTextWriter(sw))
  10.                     {
  11.                         using (GridRowControl control = new GridRowControl(row.DataItem, row.RowIndex))
  12.                         {
  13.                             _itemTemplate.InstantiateIn(control);
  14.                             control.ID = String.Format("{0}_{1}", Grid.ID, row.RowIndex);
  15.                             control.DataBind();

  16.                             control.RenderControl(htw);
  17.                         }
  18.                     }
  19.                 }

  20.                 result = output.ToString();
  21.             }

  22.             return result;
  23.         }
复制代码

3.1.8版的
  1.         internal override string GetColumnValue(GridRow row)
  2.         {
  3.             GridRowControl control = row.TemplateContainers[ColumnIndex];
  4.                         return String.Format("#@TPL@#{0}", control.ClientID);
  5.             //return String.Format("<div id="{0}_container"></div>", control.ClientID);
  6.             //string result = String.Empty;            //if (_itemTemplate != null)
  7.             //{
  8.             //    StringBuilder output = new StringBuilder();
  9.             //    using (StringWriter sw = new StringWriter(output, CultureInfo.CurrentCulture))
  10.             //    {
  11.             //        using (HtmlTextWriter htw = new HtmlTextWriter(sw))
  12.             //        {
  13.             //            //using (GridRowControl control = new GridRowControl(row.DataItem, row.RowIndex))
  14.             //            //{
  15.             //            //    _itemTemplate.InstantiateIn(control);
  16.             //            //    control.ID = String.Format("{0}_{1}", Grid.ID, row.RowIndex);
  17.             //            //    control.DataBind();            //            //    control.RenderControl(htw);            //            //}
  18.             //            //GridRowControl control = row.TemplateContainers[ColumnIndex];
  19.             //            //if (control != null)
  20.             //            //{
  21.             //            //    control.DataBind();
  22.             //            //    //control.RenderControl(htw);
  23.             //            //}
  24.             //        }
  25.             //    }            //    result = output.ToString();
  26.             //}            //return result;
  27.         }
复制代码
我尝试过用FindControl取值,但无论选中的项是选中还是未选中,都会False,最终只能用上面的Request.Form.AllKeys来获取。
System.Web.UI.WebControls.CheckBoxList cbList = (System.Web.UI.WebControls.CheckBoxList)Grid1.Rows[0].FindControl("cbList");



作者: 七色北斗星    时间: 2012-8-2 03:22
没有人遇到过这样的问题吗
作者: sanshi    时间: 2012-8-2 09:40
可以直接通过FindControl来获取CheckBoxList的值,正好AppBox中设置权限用到了,类似的代码如下:
  1. AspNet.CheckBoxList ddlOthers = (AspNet.CheckBoxList)Grid2.Rows[rowIndex].FindControl("ddlOthers");

  2.                 JObject otherPowerObj = new JObject();
  3.                 foreach (AspNet.ListItem item in ddlOthers.Items)
  4.                 {
  5.                     if (item.Selected)
  6.                     {
  7.                         otherPowerObj.Add(item.Value, true);
  8.                     }
  9.                 }
复制代码
我等下会写个类似的例子放到在线示例上。
作者: sanshi    时间: 2012-8-2 10:04
增加了新的示例,来重现你的这种情况,可以等会下载源代码,自己运行一下:
[attach]892[/attach]
作者: sanshi    时间: 2012-8-2 10:21
下载这个源代码,自己编译下,就能看到这个示例:80753

作者: 七色北斗星    时间: 2012-8-6 09:38
sanshi 发表于 2012-8-2 10:21
下载这个源代码,自己编译下,就能看到这个示例:80753

谢谢三石老况,我下载试试
作者: 七色北斗星    时间: 2012-8-9 05:26
本帖最后由 七色北斗星 于 2012-8-9 05:30 编辑
sanshi 发表于 2012-8-2 10:04
增加了新的示例,来重现你的这种情况,可以等会下载源代码,自己运行一下:
...

三石老兄你好,感谢上次你做的示例,但还是有点小Bug,我想可能是底层的问题,如下两张图,模板列内每行的CheckBoxList内的项的数量是不定的,这样每行动态绑定出的CheckBoxList会出问题,目前是列表内相同项会被绑定,不同项则不会被绑定,不知错误出现在哪里,请帮忙看一下。

图一:3.1.3原版
[attach]913[/attach]

图二:3.1.8新版
[attach]915[/attach]

作者: support    时间: 2012-8-9 08:04
七色北斗星 发表于 2012-8-9 05:26
三石老兄你好,感谢上次你做的示例,但还是有点小Bug,我想可能是底层的问题,如下两张图,模板列内每行的 ...

appbox就是每行的checkbox中的项数不同。如果还有问题,写个能运行的示例
作者: 七色北斗星    时间: 2012-8-14 01:04
support 发表于 2012-8-9 08:04
appbox就是每行的checkbox中的项数不同。如果还有问题,写个能运行的示例

我找到问题所在了,是webconfig里的配置节的问题
<pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID">

我之前的是<pages>里面的属性没有,所以才会出现那样的错误,问题解决了,谢谢各位朋友




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