[如何解决]除非 DataGridView 被数据绑定到支持更改通知并允许删除的 IBindingList,否则不能以编程方式移除行。

shichuanwuhan 2010-03-26 03:27:59
我刚刚开始学C#,现在在做一个项目,在看前人的代码。

现在想实现的是,在界面上按按钮删除一些数据,数据库中对应row的数据也删除。


private void DeleteSelectedButton_Click(object sender, EventArgs e)
{

if (MessageBox.Show("删除所选记录,你确定吗?", "确认删除", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.Cancel)
return;
for (int i = HistoryView.Rows.Count - 1; i >= 0; i--)
{
DataGridViewRow row = HistoryView.Rows[i];

if (Convert.ToBoolean(row.Cells[0].Value) == true)
{
HistoryView.Rows.RemoveAt(i);
}
}
maOp.manDB.SubmitChanges();
}


但是会报“除非 DataGridView 被数据绑定到支持更改通知并允许删除的 IBindingList,否则不能以编程方式移除行。”的错误。

我尝试绑定IBindingList如下:

HistoryView.DataSource = maOp.GetOldHistory(DateTime.Now) ;
BindingSource bs = new BindingSource();
BindingList<Man_Log> bl = new BindingList<Man_Log>(maOp.GetOldHistory(DateTime.Now));
bl.AllowRemove = true;
HistoryView.ReadOnly = false;
bs.DataSource = bl;
HistoryView.DataSource = bs;


又会报错:“集合是只读的”。

请教应该怎么弄?谢谢
...全文
2590 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Michael_Lis 2012-03-13
  • 打赏
  • 举报
回复 1
IList list = (IList)datagridview1.DataSource;
list.RemoveAt(datagridview1.CurrentRow.Index);
datagridview1.DataSource = null;
datagridview1.DataSource = list;

因为你绑定的数据源是list等集合,不是datagridview 指定的数据源,所以可以帮数据源转为list,再从集合类中remove,最后在绑定就ok
wxssaa 2011-12-07
  • 打赏
  • 举报
回复

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

private DataTable dt = new DataTable ();
private OdbcDataAdapter da = new OdbcDataAdapter();
private void Form1_Load_1(object sender, EventArgs e)
{
OdbcConnection cn = new OdbcConnection("driver={IBM DB2 ODBC DRIVER};Database=SDDT;hostname=223.1.1.19;port=50000; protocol=TCPIP;uid=LLL;pwd=BCL987; CurrentSchema=SDDT;");
OdbcCommand com = new OdbcCommand("select * from MODEL", cn);
da =new OdbcDataAdapter (com );


DataTable dt = new DataTable();

dt .Locale = System .Globalization .CultureInfo .InvariantCulture ;


da.Fill(dt);
this.dataGridView1.DataSource = dt;

}

private void getupdate()
{
dt = dataGridView1.DataSource as DataTable;//把DataGridView绑定的数据源转换成DataTable


OdbcCommandBuilder cb = new OdbcCommandBuilder(da);

//将数据放到datatable 中 datagridview 的数据源 是datatable
//修改datagridview
//更新
da.Update(dt);
}

private void button1_Click_1(object sender, EventArgs e)
{
this.getupdate();
MessageBox.Show("更新成功");
}

private void button2_Click(object sender, EventArgs e)
{
OdbcConnection con = Program.createConnection();
con.Open();

DataSet ds = new DataSet();
DataTable dt = new DataTable();
string querysql = "select * from MODEL";
OdbcDataAdapter da = new OdbcDataAdapter(querysql, con);
da.Fill(ds, "tab");
dt = ds.Tables[0];
this.dataGridView1.DataSource = dt;
con.Close();
}

private void button3_Click(object sender, EventArgs e)
{
int row = dataGridView1.SelectedRows.Count;
if (MessageBox.Show("确认删除选中的" + row.ToString() + "条记录吗?", "请确认", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
while (row > 0)
{
((DataRowView)dataGridView1.SelectedRows[0].DataBoundItem).Row.Delete();
row = row - 1;
}
this.getupdate();
MessageBox.Show("删除成功");
}

}
shichuanwuhan 2010-03-26
  • 打赏
  • 举报
回复
我现在知道需要:“在数据源中删除数据,刷新显示控件”。谁能给段小代码如何在数据库中删除数据?我大概明白就结贴了。
shichuanwuhan 2010-03-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lost_painting 的回复:]
你需要将删除操作提交到数据库
[/Quote]
就是不会这个。。。能不能写一两句代码让我参考一下?
shichuanwuhan 2010-03-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wwx6312388 的回复:]
但是会报“除非 DataGridView 被数据绑定到支持更改通知并允许删除的 IBindingList,否则不能以编程方式移除行。”的错误

你在用HistoryView这个做XUN环,在其XUN环内部是不能删除它的行的。
[/Quote]

请教下应该怎么弄呢?我这里必须要用到循环。
我没有用DataGridViewRow作循环体,用的是DataGridView的index也不行么?
鸭梨山大帝 2010-03-26
  • 打赏
  • 举报
回复
你需要将删除操作提交到数据库
wwx6312388 2010-03-26
  • 打赏
  • 举报
回复
但是会报“除非 DataGridView 被数据绑定到支持更改通知并允许删除的 IBindingList,否则不能以编程方式移除行。”的错误

你在用HistoryView这个做XUN环,在其XUN环内部是不能删除它的行的。
shichuanwuhan 2010-03-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 leon9090 的回复:]
直接删除数据库中的数据,然后重新给DATAGRIDVIEW绑定数据源
[/Quote]
我只会删除界面上的条目,不知道如何直接删除数据库里的。是用RemoveAt么?我初学,啥都不会。
zhouhang122594520 2010-03-26
  • 打赏
  • 举报
回复
抛出异常
try
{
sqlconnection sqlconnection = new sqlconnection(连接数据库);//先创建sqlconnection对象,并连接sql数据库
this.sqlconnection.Open();//在打开sql数据库连接
sqlcommand sqlcommand = new sqlcommand("delete from 表名 ",this.sqlconnection)
//在创建sqlcommand对象,并写sql语句
this.i = this.sqlcommand.ExecuteNonery();//调用sqlcommand的方法
if(i!=0)//判断
{
MessageBox.Show("删除成功!");
}
else
{
MessageBox.Show("删除失败!");

}
}catch(Exception ex)
{

}finally
{
this.sqlconnection.Close();//最后关闭
}
可以试用下
leon9090 2010-03-26
  • 打赏
  • 举报
回复
直接删除数据库中的数据,然后重新给DATAGRIDVIEW绑定数据源

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧