none
【ASP.NET】如何实现gridview显示模式与编辑模式的列数相同 RRS feed

  • 问题

  • 我有个需求。利用girdvewi呈现数据。在显示模式下是5列。在编辑状态下要增加一列。一开始我实现的思路是girdview生成数据的时候我首先隐藏这列。在编辑状态时显示出来。这种做法是可以的,但有个问题,就是显示隐藏列以后造成girdview中的列不对称。 后来我想到动态生成模板列解决。搞了半天没有实现出来。请问大家这个问题应该如何来解决呢?谢谢

     

     

    RowDataBound代码如下:

     

    protected void GvProduct_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            int? rootid = null;
            //显示模式下
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                e.Row.Attributes.Add("onmouseover", "c=this.style.backgroundColor;this.style.backgroundColor='#CCCCCC'");
                e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor=c");
               
                 rootid = Convert.ToInt32(((DataRowView)e.Row.DataItem).Row["rootid"]);
                 if (rootid == 0)
                 {
                     TableCellCollection tc = e.Row.Cells;////获取该行中所有列
                     tc.Clear();
                     tc.Add(new TableCell());//声明一个列
                     tc[0].ColumnSpan = 4;
                     //tc[0].Attributes.Add("align","center");
                     tc[0].Text = Convert.ToString(DataBinder.Eval(e.Row.DataItem, "name"));
                     tc.Add(new TableCell());
                     tc[1].Text = "<input type='checkbox' id='GvProduct_ctl0" + e.Row.RowIndex + 2 + "_chked' name='GvProduct$ctl0" + (e.Row.RowIndex + 2) + "$chked'   />";

                 }

            }
            //编辑模式下
            if (e.Row.RowState == DataControlRowState.Edit || e.Row.RowState == (DataControlRowState.Alternate | DataControlRowState.Edit))
            {

                this.GvProduct.Columns[3].Visible = true;
                string rootname = Convert.ToString(OperateDB.Do_ExecuteScalar("select name from Sk_Product where id=" + rootid));//获取分类名
                DropDownList ddlname = (DropDownList)e.Row.FindControl("ddlname");
                DataTable dtable = OperateDB.GetDataSet("select * from Sk_Product", CommandType.Text, "Sk_Product").Tables[0];
                DataRow[] rowlist = dtable.Select("rootid='0'");
                foreach (DataRow row in rowlist)
                {
                    ListItem li = new ListItem(row["name"].ToString(), row["id"].ToString());
                   ddlname.Items.Add(li);
                }
                ddlname.Items.Insert(0, "");//dropdownlist第0个元素插入空值
                //选定dropdownlist之前选定值
                foreach (ListItem sele in ddlname.Items)
                {
                    if (rootname == Convert.ToString(sele.Text))
                        sele.Selected = true;
                   
                }

                ((LinkButton)e.Row.Cells[4].FindControl("lbupdate")).Attributes.Add("onclick",
                "return Checkddlname('" + ((DropDownList)e.Row.Cells[3].FindControl("ddlname")).ClientID + "')");
               
            }

        
           


        }


    大连海参专卖 年底促销活动中 店铺地址:http://jinweb.taobao.com
    • 已移动 肖小勇Moderator 2010年12月5日 15:32 asp.net 相关问题 (发件人:.NET Framework 一般性问题讨论区)
    2010年12月3日 9:31

答案

  • 你好:

    你可以尝试将隐藏的列放到最后一个单元格。这样就不容易与合并过的单元格造成混乱的感觉。也就是说你应该将你的‘分类名'列放到最后一列隐藏起来。在编辑时显示出来。而前面所有的列不会受影响。否则你需要更新项目1和项目2的colspan的值。


    I am here!
    2010年12月7日 2:05
    版主
  • 那样的话就需要重新设置项目1和项目2的colspan的值


    I am here!
    2010年12月7日 9:04
    版主

全部回复

  • 你好!

    这可能是在更新模式下项目1所在行的 colspan 不正确或这行某列数据为空,为空时应用 &nbsp; 代替。


    知识改变命运,奋斗成就人生!
    2010年12月5日 15:31
    版主
  • 你好!

    这可能是在更新模式下项目1所在行的 colspan 不正确或这行某列数据为空,为空时应用 &nbsp; 代替。


    知识改变命运,奋斗成就人生!

    你好,对于你的话,我没有看明白,能举个例子吗?

    大连海参专卖 年底促销活动中 店铺地址:http://jinweb.taobao.com
    2010年12月6日 8:21
  • 你好:

    你可以尝试将隐藏的列放到最后一个单元格。这样就不容易与合并过的单元格造成混乱的感觉。也就是说你应该将你的‘分类名'列放到最后一列隐藏起来。在编辑时显示出来。而前面所有的列不会受影响。否则你需要更新项目1和项目2的colspan的值。


    I am here!
    2010年12月7日 2:05
    版主
  • 你好:

    你可以尝试将隐藏的列放到最后一个单元格。这样就不容易与合并过的单元格造成混乱的感觉。也就是说你应该将你的‘分类名'列放到最后一列隐藏起来。在编辑时显示出来。而前面所有的列不会受影响。否则你需要更新项目1和项目2的colspan的值。


    I am here!
    你说的到是勉强的解决了这个问题,不过有局限性,如果我只想放在前面呢?  那样的话就影响了整体的美观性了

    大连海参专卖 年底促销活动中 店铺地址:http://jinweb.taobao.com
    2010年12月7日 6:39
  • 那样的话就需要重新设置项目1和项目2的colspan的值


    I am here!
    2010年12月7日 9:04
    版主
  • 那样的话就需要重新设置项目1和项目2的colspan的值


    I am here!
    重新设置是不可取的办法。原因在于girdview显示行是按行绑定的。我原先的思路就是当点击编辑的时候设置列。取消/编辑再设置回来。但由于girdview是按行绑定的,这样的话,程序就无法判断。

    大连海参专卖 年底促销活动中 店铺地址:http://jinweb.taobao.com
    2010年12月7日 9:21