datagridview按条件筛选显示行及相关错误解决
有一个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();这两句