none
求教高手关于gridview自定义列按数据源不同的值用if或switch转换成别的显示形式 RRS feed

  • 问题

  • 如下,现在只能绑定数据字段,但如何实现跟据数据源值的不同转换成不同的显示方式,比如数据源数值为1,实际要显示的为“完成”,数据源数值为0,实际要显示为"未完成".

    谢谢!

    2012年6月15日 8:48

答案

  • 您也可以在DB端就先轉好,像是以下的SQL:

    select case when col1 = 1 then '完成' else '未完成' end as mycol
    from your_table


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    • 已标记为答案 hzpemu 2012年6月18日 0:52
    2012年6月15日 9:21
  • >>如果是多种状态怎么写?

    先写一个函数,然后在函数中做返回值判断:)

    <asp:GridView……>
      ………………
      <ItemTemplate>
        <asp:Label …… Text='<%#MyFunc(Eval("字段名称").ToString())%>'/>
      </ItemTemplate>
    </asp:GridView>

    在对应的cs文件中这样写:

    protected string Myfunc(string value)
    {
      string returnValue = string.Empty;
       if(value=="某个数值1")
       {
           returnValue="返回值1";
       }
      else if(value=="某个数值2")
       {
           returnValue="返回值2";
       }
      else if(value=="某个数值3")
       {
           returnValue="返回值3";
       }
      ………………
      return returnValue;
    }

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已标记为答案 hzpemu 2012年6月18日 0:52
    2012年6月16日 0:54
  • 还可以使用 GridView 的事件 RowDataBound 进行处理,在这里可以通过 FindControl 取得控件的引用,然后,随你的便了。

    protected void grid_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            Label lbl = e.Row.FindControl("lbl") as Label;
            DataObject data = e.Row.DataItem as DataObject;
    
            switch (data.Type)
            {
                case "a":
                    lbl.Text = "状态 a";
                    break;
                case "b":
                    lbl.Text = "状态 b";
                    break;
                case "c":
                    lbl.Text = "状态 c";
                    break;
            }
        }
    }


    冠军

    你这个方法可以是可以,我之前也这么做,不过前提是那一列必须存在于gridview列中,但用户很多情况下其实不必看到数据源那一列。
    • 已标记为答案 hzpemu 2012年6月18日 0:55
    2012年6月18日 0:54

全部回复

  • 转换成TemplateField然后这样做:

    <asp:GridView……>
      ………………
      <ItemTemplate>
        <asp:Label …… Text='<%#Eval("字段名称").ToString()=="1"?"完成":"未完成"%>'/>
      </ItemTemplate>
    </asp:GridView>

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年6月15日 8:56
  • 您也可以在DB端就先轉好,像是以下的SQL:

    select case when col1 = 1 then '完成' else '未完成' end as mycol
    from your_table


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    • 已标记为答案 hzpemu 2012年6月18日 0:52
    2012年6月15日 9:21

  • 转换成TemplateField然后这样做:

    <asp:GridView……>
      ………………
      <ItemTemplate>
        <asp:Label …… Text='<%#Eval("字段名称").ToString()=="1"?"完成":"未完成"%>'/>
      </ItemTemplate>
    </asp:GridView>

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    如果是多种状态怎么写?(比如用a,b,c三种值,分别要显示成"甲""乙"丙")这是javascript吗?谢谢!

    • 已编辑 hzpemu 2012年6月15日 13:18
    2012年6月15日 13:18
  • 您也可以在DB端就先轉好,像是以下的SQL:

    select case when col1 = 1 then '完成' else '未完成' end as mycol
    from your_table


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    这个确实可以,但我想尝试在gridview中生成.不过还是谢谢!
    2012年6月15日 13:19
  • 还可以使用 GridView 的事件 RowDataBound 进行处理,在这里可以通过 FindControl 取得控件的引用,然后,随你的便了。

    protected void grid_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            Label lbl = e.Row.FindControl("lbl") as Label;
            DataObject data = e.Row.DataItem as DataObject;
    
            switch (data.Type)
            {
                case "a":
                    lbl.Text = "状态 a";
                    break;
                case "b":
                    lbl.Text = "状态 b";
                    break;
                case "c":
                    lbl.Text = "状态 c";
                    break;
            }
        }
    }


    冠军

    2012年6月15日 15:13
  • >>如果是多种状态怎么写?

    先写一个函数,然后在函数中做返回值判断:)

    <asp:GridView……>
      ………………
      <ItemTemplate>
        <asp:Label …… Text='<%#MyFunc(Eval("字段名称").ToString())%>'/>
      </ItemTemplate>
    </asp:GridView>

    在对应的cs文件中这样写:

    protected string Myfunc(string value)
    {
      string returnValue = string.Empty;
       if(value=="某个数值1")
       {
           returnValue="返回值1";
       }
      else if(value=="某个数值2")
       {
           returnValue="返回值2";
       }
      else if(value=="某个数值3")
       {
           returnValue="返回值3";
       }
      ………………
      return returnValue;
    }

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已标记为答案 hzpemu 2012年6月18日 0:52
    2012年6月16日 0:54
  • 还可以使用 GridView 的事件 RowDataBound 进行处理,在这里可以通过 FindControl 取得控件的引用,然后,随你的便了。

    protected void grid_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            Label lbl = e.Row.FindControl("lbl") as Label;
            DataObject data = e.Row.DataItem as DataObject;
    
            switch (data.Type)
            {
                case "a":
                    lbl.Text = "状态 a";
                    break;
                case "b":
                    lbl.Text = "状态 b";
                    break;
                case "c":
                    lbl.Text = "状态 c";
                    break;
            }
        }
    }


    冠军

    你这个方法可以是可以,我之前也这么做,不过前提是那一列必须存在于gridview列中,但用户很多情况下其实不必看到数据源那一列。
    • 已标记为答案 hzpemu 2012年6月18日 0:55
    2012年6月18日 0:54