datagridview按条件筛选显示行及相关错误解决

datagridview按条件筛选显示行及相关错误解决

编码文章call10242025-04-25 11:08:327A+A-

有一个datagridview,现在想按一定条件筛选出想要的行,效果如下:


整体代码如下:(主要就是modifydt()这个函数,其它是绑定数据)

using System.Data;
using System.Data.Common;

namespace mydgv
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //造几个数据 这里有3列
        DataTable GetDT()
        {
            DataTable mydt = new DataTable();

            #region 自增列
            //第一列自增列
            DataColumn zzl = mydt.Columns.Add("自增列", typeof(Int32));

            //自动递增
            zzl.AutoIncrement = true;

            //值必须唯一
            zzl.Unique = true;

            //从多少开始,默认从0开始
            zzl.AutoIncrementSeed = 1;
            //每行间隔数为多少,也就是自增量
            zzl.AutoIncrementStep = 10;
            #endregion

            //第二列ID
            DataColumn dc0 = mydt.Columns.Add("ID", typeof(Int32));

            //第三列数据
            DataColumn dc1 = new DataColumn();
            mydt.Columns.Add(dc1);

            for (int i = 0; i < 5; i++)
            {
                DataRow newRow = mydt.NewRow();
                newRow[1] = "0";
                newRow[2] = i;
                //在最后面插入数据
                mydt.Rows.Add(newRow);
            }

            return mydt;
        }

        //绑定数据
        void GetData()
        {
            //绑定本来的数据
            dataGridView1.DataSource = GetDT();
            //创建一个按钮列 第4列
            DataGridViewButtonColumn delbtn = new DataGridViewButtonColumn();
            //是否用自定义的文本
            delbtn.UseColumnTextForButtonValue = true;
            delbtn.Text = "删除数据";
            delbtn.Name = "Delete";
            delbtn.HeaderText = "删除";
            //添加按钮列
            dataGridView1.Columns.Add(delbtn);

            int count = dataGridView1.Rows.Count;
            for (int i = 0; i < count - 1; i++)
            {
                //我这里是第2列格子的内容
                string theid = dataGridView1.Rows[i].Cells[2].Value.ToString();

                //如果内容是 1 
                if (theid == "1")
                {
                    DataGridViewTextBoxCell txtcell = new DataGridViewTextBoxCell();

                    dataGridView1.Rows[i].Cells[3] = txtcell;
                    txtcell.ReadOnly = true;
                }
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            comboBox1.SelectedIndex = 0;

            //绑定数据
            GetData();
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            //改变时更改数据
            modifydt();
        }

        CurrencyManager cm = null;

        void modifydt()
        {
            int themode = comboBox1.SelectedIndex;

            int count = dataGridView1.Rows.Count;

            DataGridViewRow dr;
            switch (themode)
            {
                case 0:
                    for (int i = 0; i < count; i++)
                    {
                        dr = dataGridView1.Rows[i];
                        dr.Visible = true;
                    }
                    break;
                case 1:
                    for (int i = 0; i < count; i++)
                    {
                        dr = dataGridView1.Rows[i];
                        string theuid = dr.Cells["自增列"].Value.ToString();
                        int uidint = Int32.Parse(theuid);
                        if (uidint < 20)
                        {
                            dr.Visible = true;
                        }
                        else
                        {
                            dr.Visible = false;
                        }
                    }
                    break;
                case 2:
                    for (int i = 0; i < count; i++)
                    {
                        dr = dataGridView1.Rows[i];
                        dr = dataGridView1.Rows[i];
                        string theuid = dr.Cells["自增列"].Value.ToString();
                        int uidint = Int32.Parse(theuid);
                        if (uidint > 19)
                        {
                            dr.Visible = true;
                        }
                        else
                        {
                            dr.Visible = false;
                        }
                    }
                    break;
                default:
                    break;
            }
        }
    }
}

运行了两下就会出错:与货币管理器的位置关联的行不能设置为不可见。

网上搜索了一下说是应该先挂起数据绑定再恢复云云,反正就是用下面的方法搞一下,就行了。

1、先定义一个全局的对象:

CurrencyManager cm = null;

2、绑定数据结束后

//绑定数据
void GetData()
{
    //绑定本来的数据
    dataGridView1.DataSource = GetDT();

    //这里 -----------------------------------
    cm = (CurrencyManager)BindingContext[dataGridView1.DataSource];

3、改变状态时

void modifydt()
{
    int themode = comboBox1.SelectedIndex;

    int count = dataGridView1.Rows.Count;

    DataGridViewRow dr;
    switch (themode)
    {
        case 0:
            for (int i = 0; i < count; i++)
            {
                dr = dataGridView1.Rows[i];
                dr.Visible = true;
            }
            break;
        case 1:
            cm.SuspendBinding();   //----------------------------------------
            for (int i = 0; i < count; i++)
            {
                dr = dataGridView1.Rows[i];
                string theuid = dr.Cells["自增列"].Value.ToString();
                int uidint = Int32.Parse(theuid);
                if (uidint < 20)
                {
                    dr.Visible = true;
                }
                else
                {
                    dr.Visible = false;
                }
            }
            cm.ResumeBinding();   //----------------------------------------
            break;
        case 2:
            cm.SuspendBinding();
            for (int i = 0; i < count; i++)
            {
                dr = dataGridView1.Rows[i];
                dr = dataGridView1.Rows[i];
                string theuid = dr.Cells["自增列"].Value.ToString();
                int uidint = Int32.Parse(theuid);
                if (uidint > 19)
                {
                    dr.Visible = true;
                }
                else
                {
                    dr.Visible = false;
                }
            }
            cm.ResumeBinding();
            break;
        default:
            break;
    }
}

主要就是 cm.SuspendBinding(); 和 cm.ResumeBinding();这两句

点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4