databound如下:protected void CustomersGridView_RowDataBound(Object sender, GridViewRowEventArgs e)
    {
        foreach (GridViewRow row in GridView1.Rows)
        {
            if (GridView1.DataKeys[0][0].ToString() == "1")
                row.Cells[2].Text = "a";
            else if (GridView1.DataKeys[0][1].ToString() == "1")
                row.Cells[2].Text = "b";
            else if (GridView1.DataKeys[0][2].ToString() == "1")
                row.Cells[2].Text = "c";
            else if (GridView1.DataKeys[0][3].ToString() == "1")
                row.Cells[2].Text = "d";
            else row.Cells[2].Text = "e";
        }
    }目的为判断几个隐藏列的内容,是1的话第3列则显示相应内容。
遇到的问题为:说有两行分别满足显示不同内容的的条件时,都显示rowindex靠前的那种,比如我想要的输出为
01 id1 a
02 id2 b
但实际输出为:
01 id1 a
02 id2 a
我在csdn搜索到过逐行修改的方法为:
foreach (GridViewRow myrow in GridView1.Rows)
{
    string i = myrow.Cells[1].Text;
    if (i.Contains("bb")==true)
    {
        myrow.Cells[1].Text = i.Replace("bb","cc");                    
    }
}
写在GridView1_RowDataBound事件里感觉和我用的没什么不同。。

解决方案 »

  1.   

    不太懂你要实现什么,不过我觉得先把你要显示的a\b\c转换好;
    然后就是显示列,这个是否可以理解为要么显示全部是a(任何一种)的,要么有不同就显示第一种的,那就把第一列的读出来然后判断显示那一种就好了阿
      

  2.   

    eh。。我没表述清楚。
    只显示一行的情况我的abc都显示正确的了;
    我想实现的是同一列在不同行可以显示不同的内容,但目前没有实现,而是后面的都跟第一行显示一样;
      

  3.   

    我用 
            for (int row_ind = 0; row_ind < GridView1.Rows.Count; row_ind++)
            {
                GridViewRow row = GridView1.Rows[row_ind];结果也是一样的
      

  4.   

    不一样的,还是我上面的那个例子,我把两个都设成visible=true的话显示为:01 id1 a ... 1 0
    02 id2 a ... 0 1而我设想的结果应该是:
    01 id1 a ... 1 0
    01 id1 b ... 0 1
      

  5.   

    楼上什么意思?还和系统sp有关的?
    vs2005和xp的补丁基本都是最新的
      

  6.   

    那你单步调试下,看看每次得到GridView1.DataKeys[0][0--4].ToString() 的值是多少?
      

  7.   

    如果你是在后台来取隐藏列的数据
    完全可以直接使用
    e.item.cells[i].text,不需要使用datakeys来定位
      

  8.   

    一样的
    在后台进行修改完全可以直接用e.item.cells[i].text 来取得相应隐藏列的值,用不着使用datakey了
      

  9.   

    编译器错误信息: CS0117: “System.Web.UI.WebControls.GridViewRowEventArgs”并不包含“item”的定义
      

  10.   

    e.后头没item项,参数不是"GridViewRowEventArgs e"么?
      

  11.   

    zzz
    又忘记是2.0不是1.1了
    应该是
    e.Row.Cells[i].Text
      

  12.   

    抱歉啊
    应该
    if (e.Row.Cell【5】.Text.Trim() == "1")
                    row.Cells[2].Text = "a";
                else if (e.Row.Cells[6].Text.Trim()== "1")
                    row.Cells[2].Text = "b";
                ....
      

  13.   

    我原来就用的那,取不到值才用的datakeys。。
      

  14.   

    哦,以前没+ trim()。。我再试试
      

  15.   

    用了 e.Row.Cell[5].Text.Trim() == "1" 后取不到值的,本来能正常显示a的变成了else中的e
      

  16.   

    你这个gridview使用了模版列没有?
      

  17.   

    Sorry,前面单步调试没看好,刚才看了下,好像都一直取的第一行的值,所以才出现的我那状况。
    这应该是我这循环的问题了吧,有什么不对么?
      

  18.   

    哦,仔细看了你的代码
     foreach (GridViewRow row in GridView1.Rows)
            {}
    不用这个循环
      

  19.   

    因为rowdatabound是绑定每行数据的时候触发!!!
      

  20.   

    去掉for循环之后,又出现昨天的index超出范围错误了:
    索引超出范围。必须为非负值并小于集合大小。
    参数名: index 
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.ArgumentOutOfRangeException: 索引超出范围。必须为非负值并小于集合大小。
    参数名: index源错误:
      if (GridView1.DataKeys[0][0].ToString() == "1")
      

  21.   

    但我用e.row.cells[5].text或e.row.cells[5].text.trim()都取不到隐藏列的值啊
      

  22.   

    我现在只用datakeys取到过隐藏列的值,虽然循环的时候一直在第一行
      

  23.   

    刚好看到篇文章在用datakeys时用到了“DataKey data = GridView1.DataKeys[rowIndex};”语句,考虑了下原先的症状,想到datakeys[][]的第一个[]应该是rowIndex,刚好和我原先问题符合,于是尝试了以下代码并最终解决了问题:
            for (int row_ind = 0; row_ind < GridView1.Rows.Count; row_ind++)
            {
                GridViewRow row = GridView1.Rows[row_ind];
                if (GridView1.DataKeys[0][0].ToString() == "1")
                    row.Cells[2].Text = "a";
                else if (GridView1.DataKeys[0][1].ToString() == "1")
                ......不过这里有些疑惑,一是jimu8130提到了rowdatabound是绑定每行数据时触发,为什么我这里还是需要一个循环;二是foreach语句ms和datakeys完全无关,为什么去掉了foreach循环后即使GridView1.DataKeys[0].ToString()都会提示index超出范围。。