功能:遍历datagridview控件中“关键词”所在列的值,如果存在相同的值,则将重复的值标记为空!
代码如下
int k,m;
            for(k=0;k<dataGridView.RowCount;++k)
            {
                for (m = 1; m<dataGridView.RowCount;++m )
                {
                    if ((m>k)&&(dataGridView.Rows[k].Cells["keyword"].Value == dataGridView.Rows[m].Cells["keyword"].Value))
                    {
                        dataGridView.Rows[m].Cells["keyword"].Value = null;
                    }
                }
            }
程序的结果是,点击按钮,没有任何的反映,求教各位高手如何解决!DataGridView控件遍历

解决方案 »

  1.   

    for(int k=0;k<dataGridView.RowCount;k++)
                {
                    for (int m = k+1; m<dataGridView.RowCount;m++ )
                    {
                        if ((dataGridView.Rows[k].Cells[0].Text == dataGridView.Rows[m].Cells[0].Text))
                        {
                            dataGridView.Rows[m].Cells[0].Text= string.Empty;
                        }
                    }
                }
    根据索引号去查看看呢
      

  2.   

    这个是从excel中导入的,进行的去重处理!点击按钮,就是把重复的去掉!
      

  3.   

    这个是从excel中导入的,进行的去重处理!点击按钮,就是把重复的去掉!
    这也是一样啊 excel的数据是数据源  点击确定只是你把Excel的数据处理完以后重新绑定! 不需要在dataGridView中处理 明白
      

  4.   

    最好把click事件的代码都发上来
      

  5.   


    private void button2_Click(object sender, EventArgs e)
            {
                for(int k=0;k<dataGridView.RowCount;++k)
                {
                    for (int m = k+1;m<dataGridView.RowCount;++m )
                    {
                        if (dataGridView.Rows[k].Cells[1].Value == dataGridView.Rows[m].Cells[1].Value)
                        {
                            dataGridView.Rows[m].Cells[1].Value = null;
                        }
                    }
                }
            }这个就是去重按钮的事件!求帮忙呀!
      

  6.   

    点没反应?加个MessageBox.Show调试下不就知道了
      

  7.   

    设置了,message可以正常显示的!说明按钮还是好用的,但是就是不知道,为什么不能标记为空!
      

  8.   


    private void button2_Click(object sender, EventArgs e)
            {
                for(int k=0;k<dataGridView.RowCount;++k)
                {
                    for (int m = k+1;m<dataGridView.RowCount;++m )
                    {
                        if (dataGridView.Rows[k].Cells[1].Value == dataGridView.Rows[m].Cells[1].Value)
                        {
                            dataGridView.Rows[m].Cells[1].Value = null;
                        }
                    }
                }
                MessageBox.Show(dataGridView.Rows[0].Cells[1].Value.ToString());
            }
    message可以正常显示!
      

  9.   

    截dataGridView图上来,看看数据
      

  10.   

    点击去重 数据改变了?  如果数据改变了只能说明dataGridView的没有重新把改变的数据绑定上去!
    INotifyPropertyChanged 看看这个
      

  11.   

    其实问题在这里 
     for (int m = k+1;m<dataGridView.RowCount;++m )
                    {
                        if (dataGridView.Rows[k].Cells[1].Value == dataGridView.Rows[m].Cells[1].Value)
                        {
                            dataGridView.Rows[m].Cells[1].Value = null;
                        }
                    }
    你把这里改成下面这样:
     for (int m = k+1;m<dataGridView.RowCount;++m )
                    {
                        if (dataGridView.Rows[k].Cells[1].Value.ToString() == dataGridView.Rows[m].Cells[1].Value.ToString())
                        {
                            dataGridView.Rows[m].Cells[1].Value = null;
                        }
                    }因为dataGridView.Rows[k].Cells[1].Values是个Object的类型,所以得到的值虽然是一样,但是没法相等,你转换成string类型就可以了,不过你的m=k+1,有可能到最后一行的时候dataGridView.Rows[m].Cells[1].Value=null,这样转换就会报错,所以在转换成string之前你最好先判断一下dataGridView.Rows[m].Cells[1].Value是否为null
      

  12.   

    在判断是否相等之前判断一下后面那个值是否为空,为空就给他赋个空值就是了
    你这样写: for (int m = k+1;m<dataGridView.RowCount;++m )
                    {if(dataGridView.Rows[m].Cells[1].Value==null)
    {
    dataGridView.Rows[m].Cells[1].Value="";
    }
                        if (dataGridView.Rows[k].Cells[1].Value.ToString() == dataGridView.Rows[m].Cells[1].Value.ToString())
                        {
                            dataGridView.Rows[m].Cells[1].Value = null;
                        }
                    }
      

  13.   

    for (int m = k+1;m<dataGridView.RowCount;++m )
                    {
    object str=dataGridView.Rows[k].Cells[1].Value;
    object str2=dataGridView.Rows[m].Cells[1].Value;
    if(str2==null)
    {
    str2="";
    }
                        if (str.ToString() == str2.ToString() )
                        {
                            dataGridView.Rows[m].Cells[1].Value = null;
                        }
                    }
      

  14.   

    不建议直接修改dataGridView的cell
    可尝试修改dataGridView.DataSource 然后重新指定数据源例如 dataGridView.DataSource = list1;
    你只需要修改list1就可以 然后重新dataGridView.DataSource = list1;
      

  15.   

     把dataGridView.Rows[m].Cells[1].Value=null;
     换成dataGridView.Rows[m].Cells[1].text="";试试
      

  16.   


    如果不行 那就真给它一个值 dataGridView.Rows[m].Cells[1].Value="&nbsp;" 不要跟我说不识别空格
      

  17.   

    导入EXCEL将数据缓存,点击去重,处理缓存的数据,然后想保存保存想干什么干什么?怎么没法修改?
      

  18.   


    如果不行 那就真给它一个值 dataGridView.Rows[m].Cells[1].Value="&nbsp;" 不要跟我说不识别空格问题解决了,如果想知道,可以看我的下一篇帖子!
      

  19.   

    兄弟 你处理循环的逻辑有问题,你看,循环变量K,M 没有关系,比如我们设想为5行,从K=0从第一行开始,然后M=1,就是第2行开始,M<5,  M从1到4, 也就是M从第2行循环到第5行,这一步是没问题的,但当K第二次循环了,也就是K=1,也就是第二行,这个时候你的M从1开始,(因为K是循环体内部变量),这个时候就是第二行跟第二行对比,同一行相比,肯定是一样的,这个时候会按设置要求为空,也就是第二行是为空的。这就不对了。当K循环自增到2,也就是第三行,M还是从第2行开始循环,到第5行一一跟第二行对比。
     以下是例子:(仅供参考,并不严谨)
    for(int k=0;k<dataGridView.RowCount;k++)
                {
                    for (int m = k+1; m<dataGridView.RowCount;m++ )
                    {
                        if ((dataGridView.Rows[k].Cells[0].Text == dataGridView.Rows[m].Cells[0].Text))
                        {
                            dataGridView.Rows[m].Cells[0].Text= string.Empty;
                        }
                    }
                }