На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Работа с BindingNavigatot
    Попробовал использовать навигатор:
    ExpandedWrap disabled
      namespace ADOnet
      {
        public partial class Form1 : Form
        {
       
          private DataSet ds;
          private OleDbDataAdapter da;
          OleDbCommand cmd;
          OleDbConnection con;
          OleDbParameter p;
          BindingSource bs;
       
          public Form1()
          {
            InitializeComponent();
          }
       
          private void Form1_Load(object sender, EventArgs e)
          {
            openDb();
            ds = new DataSet();
            ds.Tables.Add("tbl1ds");
            da = new OleDbDataAdapter();
            cmd = con.CreateCommand();
            cmd.CommandText = "SELECT *FROM tbl1";
            da.SelectCommand = cmd;
            da.FillSchema(ds, SchemaType.Source, "tbl1ds");
            da.Fill(ds, "tbl1ds");
            cmd.CommandText = "SELECT *FROM tbl2";
            da.SelectCommand = cmd;
            da.FillSchema(ds, SchemaType.Source, "tbl2ds");
            bs = new BindingSource();
            bs.DataSource = ds.Tables[0];
            bsnav.BindingSource = bs;
            dgv1.DataSource = bs;
            daInsert();
            daUpdate();
            daDelete();
          }
       
          private void daInsert()
          {
            string strIns = "INSERT INTO tbl1(id, txt) VALUES (?, ?)";
            OleDbCommand insertCmd = new OleDbCommand(strIns, con);
            da.InsertCommand = insertCmd;
            p = new OleDbParameter("@id", OleDbType.Integer);
            p.SourceColumn = "id";
            p.SourceVersion = DataRowVersion.Original;
            insertCmd.Parameters.Add(p);
            p = new OleDbParameter("@txt", OleDbType.VarChar);
            p.SourceColumn = "txt";
            p.SourceVersion = DataRowVersion.Original;
            insertCmd.Parameters.Add(p);
          }
       
          private void daUpdate()
          {
            string strUpd = "UPDATE tbl1 SET txt = ? WHERE id = ?";
            OleDbCommand updateCmd = new OleDbCommand(strUpd, con);
            da.UpdateCommand = updateCmd;
            p = new OleDbParameter("@txt", OleDbType.VarChar);
            p.SourceColumn = "txt";
            p.SourceVersion = DataRowVersion.Current;
            updateCmd.Parameters.Add(p);
            p = new OleDbParameter("@id", OleDbType.Integer);
            p.SourceColumn = "id";
            p.SourceVersion = DataRowVersion.Original;
            updateCmd.Parameters.Add(p);
          }
       
          private void daDelete()
          {
            string strDel = "DELETE FROM tbl1 WHERE id = ? AND txt = ?";
            OleDbCommand deleteCmd = new OleDbCommand(strDel, con);
            da.DeleteCommand = deleteCmd;
            p = new OleDbParameter("@id", OleDbType.Integer);
            p.SourceColumn = "id";
            p.SourceVersion = DataRowVersion.Current;
            deleteCmd.Parameters.Add(p);
            p = new OleDbParameter("@txt", OleDbType.VarChar);
            p.SourceColumn = "txt";
            p.SourceVersion = DataRowVersion.Current;
            deleteCmd.Parameters.Add(p);
          }
       
          private void openDb()
          {
            con = new OleDbConnection();
            con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\\Adonet.mdb";
            try
            {
              con.Open();
            }
            catch
            {
              MessageBox.Show("Ошибка соединения с базой данных AdoStudy.mdb");
              Application.Exit();
            }
          }
       
          private void bindingNavigatorSaveItem_Click(object sender, EventArgs e)
          {
            da.Update(ds.Tables[0]);
          }
       
          private void bindingNavigatorDeleteItem_Click(object sender, EventArgs e)
          {
            DataRowView dr = (DataRowView) bs.Current;
            dr.Delete();
          }
       
          private void bindingNavigatorMoveNextItem_Click(object sender, EventArgs e)
          {
            bs.MoveNext();
          }
       
          private void bindingNavigatorMovePreviousItem_Click(object sender, EventArgs e)
          {
            bs.MovePrevious();
       
          }
       
          private void bindingNavigatorMoveFirstItem_Click(object sender, EventArgs e)
          {
            bs.MoveFirst();
          }
       
          private void bindingNavigatorMoveLastItem_Click(object sender, EventArgs e)
          {
            bs.MoveLast();
          }
       
          private void bindingNavigatorAddNewItem_Click(object sender, EventArgs e)
          {
            bs.AddNew();
          }
        }
      }
    В результате:
    - при перемещении выделяется не следующая строка, а через одну;
    - при удалении удаляется текущая и следующая за ней строки;
    - правильно работает только добавление записи и переход вначало/конец записей.
    Подскажите, пожалуйста, что я сделал неправильно. Код проекта прилагаю.
    Прикреплённый файлПрикреплённый файлAdoNet2.zip (29,69 Кбайт, скачиваний: 151)
      Цитата tumanovalex @
      - при перемещении выделяется не следующая строка, а через одну;
      - при удалении удаляется текущая и следующая за ней строки;

      И на какие мысли это наводит?
        Где-то операции дублируются, а вот где - не знаю.
          Цитата tumanovalex @
          Где-то операции дублируются

          очевидно здесь:
          private void bindingNavigatorMoveNextItem_Click(object sender, EventArgs e)
          {
          bs.MoveNext();
          }
            Спасибо за подсказку. Не думал. что код
            ExpandedWrap disabled
                    bs = new BindingSource();
                    bs.DataSource = ds.Tables[0];
                    bsnav.BindingSource = bs;
                    dgv1.DataSource = bs;
            обеспечивает работу кнопок BindingNavigator. Убрал обработку нажатий кнопок на BindingNavigator, дублирование исчезло. Однако появилась новая проблема: при удалении нескольких записей и попытке сохранения изменений получаю сообщение: "Нарушение параллелизма: DeleteCommand затронула 0 из ожидаемых 1 записей." и остановка программы на строке: da.Update(ds.Tables[0]); в коде
            ExpandedWrap disabled
              namespace ADOnet
              {
                public partial class Form1 : Form
                {
               
                  private DataSet ds;
                  private OleDbDataAdapter da;
                  OleDbCommand cmd;
                  OleDbConnection con;
                  OleDbParameter p;
                  BindingSource bs;
               
                  public Form1()
                  {
                    InitializeComponent();
                  }
               
                  private void Form1_Load(object sender, EventArgs e)
                  {
                    openDb();
                    ds = new DataSet();
                    ds.Tables.Add("tbl1ds");
                    da = new OleDbDataAdapter();
                    cmd = con.CreateCommand();
                    cmd.CommandText = "SELECT *FROM tbl1";
                    da.SelectCommand = cmd;
                    da.FillSchema(ds, SchemaType.Source, "tbl1ds");
                    da.Fill(ds, "tbl1ds");
                    cmd.CommandText = "SELECT *FROM tbl2";
                    da.SelectCommand = cmd;
                    da.FillSchema(ds, SchemaType.Source, "tbl2ds");
                    bs = new BindingSource();
                    bs.DataSource = ds.Tables[0];
                    bsnav.BindingSource = bs;
                    dgv1.DataSource = bs;
                    daInsert();
                    daUpdate();
                    daDelete();
                  }
               
                  private void daInsert()
                  {
                    string strIns = "INSERT INTO tbl1(id, txt) VALUES (?, ?)";
                    OleDbCommand insertCmd = new OleDbCommand(strIns, con);
                    da.InsertCommand = insertCmd;
                    p = new OleDbParameter("@id", OleDbType.Integer);
                    p.SourceColumn = "id";
                    p.SourceVersion = DataRowVersion.Original;
                    insertCmd.Parameters.Add(p);
                    p = new OleDbParameter("@txt", OleDbType.VarChar);
                    p.SourceColumn = "txt";
                    p.SourceVersion = DataRowVersion.Original;
                    insertCmd.Parameters.Add(p);
                  }
               
                  private void daUpdate()
                  {
                    string strUpd = "UPDATE tbl1 SET txt = ? WHERE id = ?";
                    OleDbCommand updateCmd = new OleDbCommand(strUpd, con);
                    da.UpdateCommand = updateCmd;
                    p = new OleDbParameter("@txt", OleDbType.VarChar);
                    p.SourceColumn = "txt";
                    p.SourceVersion = DataRowVersion.Current;
                    updateCmd.Parameters.Add(p);
                    p = new OleDbParameter("@id", OleDbType.Integer);
                    p.SourceColumn = "id";
                    p.SourceVersion = DataRowVersion.Original;
                    updateCmd.Parameters.Add(p);
                  }
               
                  private void daDelete()
                  {
                    string strDel = "DELETE FROM tbl1 WHERE id = ? AND txt = ?";
                    OleDbCommand deleteCmd = new OleDbCommand(strDel, con);
                    da.DeleteCommand = deleteCmd;
                    p = new OleDbParameter("@id", OleDbType.Integer);
                    p.SourceColumn = "id";
                    p.SourceVersion = DataRowVersion.Original;
                    deleteCmd.Parameters.Add(p);
                    p = new OleDbParameter("@txt", OleDbType.VarChar);
                    p.SourceColumn = "txt";
                    p.SourceVersion = DataRowVersion.Original;
                    deleteCmd.Parameters.Add(p);
                  }
               
                  private void openDb()
                  {
                    con = new OleDbConnection();
                    con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\\Adonet.mdb";
                    try
                    {
                      con.Open();
                    }
                    catch
                    {
                      MessageBox.Show("Ошибка соединения с базой данных AdoStudy.mdb");
                      Application.Exit();
                    }
                  }
               
                  private void bindingNavigatorSaveItem_Click(object sender, EventArgs e)
                  {
                    da.Update(ds.Tables[0]);
                  }
               
                  private void bindingNavigatorAddNewItem_Click(object sender, EventArgs e)
                  {
                    bs.AddNew();
                  }
                }
              }
            Подскажите, пожалуйста, как исправить эту ошибку.
              а зачем вообще в команде удаления параметр @txt?
                Действительно, убрал txt и все получилось. Спасибо большое!
                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0299 ]   [ 17 queries used ]   [ Generated: 19.05.24, 10:06 GMT ]