+ -
当前位置:首页 → 问答吧 → [如何解决]除非 DataGridView 被数据绑定到支持更改通知并允许删除的 IBindingList,否则不能以编程方式移除行。

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

时间:2010-03-26

来源:互联网

我刚刚开始学C#,现在在做一个项目,在看前人的代码。

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

C# code

        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如下:
C# code

       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;



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

请教应该怎么弄?谢谢

作者: shichuanwuhan   发布时间: 2010-03-26

直接删除数据库中的数据,然后重新给DATAGRIDVIEW绑定数据源

作者: leon9090   发布时间: 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();//最后关闭
}
可以试用下

作者: zhouhang122594520   发布时间: 2010-03-26

引用 1 楼 leon9090 的回复:
直接删除数据库中的数据,然后重新给DATAGRIDVIEW绑定数据源

我只会删除界面上的条目,不知道如何直接删除数据库里的。是用RemoveAt么?我初学,啥都不会。

作者: shichuanwuhan   发布时间: 2010-03-26

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

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

作者: wwx6312388   发布时间: 2010-03-26

你需要将删除操作提交到数据库

作者: Lost_Painting   发布时间: 2010-03-26

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

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


请教下应该怎么弄呢?我这里必须要用到循环。
我没有用DataGridViewRow作循环体,用的是DataGridView的index也不行么?

作者: shichuanwuhan   发布时间: 2010-03-26

引用 5 楼 lost_painting 的回复:
你需要将删除操作提交到数据库

就是不会这个。。。能不能写一两句代码让我参考一下?

作者: shichuanwuhan   发布时间: 2010-03-26

我现在知道需要:“在数据源中删除数据,刷新显示控件”。谁能给段小代码如何在数据库中删除数据?我大概明白就结贴了。

作者: shichuanwuhan   发布时间: 2010-03-26

C# code

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("删除成功");
            }

        }

作者: wxssaa   发布时间: 2011-12-07