2011-09-14 3 views
1

Здравствуйте, я прочитал несколько статей, но не получаю ответа, который я ищу. Я хочу сделать два раза. 1. Настройте datagridview из запроса NOT таблицы непосредственно с помощью кнопки, которая выполняет запрос для заполнения. 2. Измените значения в datagrid, чтобы произнести BACK в базе данных, чтобы внести изменения. Проблема, с которой я сталкиваюсь, - это пример, который я нахожу в предположении, что у вас есть универсум STATIC, который не может измениться. Я уже знал часть населения, но мне любопытно, как вы используете datagridview для подключения к базе данных и говорите: «Сделайте то, что я покажу в этот момент, как изменения, и сохраните их в базе данных, из которой они первоначально пришли».Заполнение базы данных SQL в результате изменений Windows Forms DataGridView

Код Я немного следил: http://www.switchonthecode.com/tutorials/csharp-tutorial-binding-a-datagridview-to-a-database Они использовали метод доступа, и я использую SQL, но это не имеет большого значения.

EG: Я могу установить элемент dataAdapter в одном экземпляре процесса, но другой экземпляр НЕ знает об этом. Я предполагаю, что что-то можно сделать, поскольку вы можете сделать это довольно легко с перетаскиванием с наборами данных. Возможно, я тоже ошибаюсь и должен устанавливать некоторые элементы статические и некоторые динамические. Все, что мне действительно нужно, это доказать, что я могу изменить значения под VALUE на что-то другое и передать их обратно в базу данных с источником привязки. Однако источник привязки неизвестен в другом экземпляре, и некоторые вещи статически встречаются с ошибкой, как я их определял. Любая помощь очень ценится, спасибо!

PRE SET UP:

  1. Создать 'Test' База данных с одной таблицы определяется как:

    Создать таблицу Test (ID INT Идентичность, VALUE VARCHAR (2)) вставки в тесте значения ('A'), ('B'), ('C')

  2. Создание приложения Windows Form в Visual Studio 2010 (должно работать в 2008 или ранее, поскольку я не считаю, что я делаю что-либо явно .NET 4.0). Форма Windows должна иметь две кнопки: a. 'btnPopulate' b. 'BtnUpdate'; текстовое поле: 'txtquery', заполненный текстом: 'select * from Test'; и datagridview: «gridview».

Фактический используемый код позади формы:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Data.SqlClient; 

namespace DataGridTestDBUpdater 
{ 
    public partial class TestDataGrid : Form 
    { 
     public string con = "Integrated Security=SSPI;Persist Security Info=False;Data Source =(local);Initial Catalog=Test"; 

     public TestDataGrid() 
     { 
      InitializeComponent(); 
     } 

     private void btnPopulate_Click(object sender, EventArgs e) 
     { 
      string query = txtquery.Text; 

      using (SqlConnection cn = new SqlConnection(con)) 
      { 
       using (SqlCommand cmd = new SqlCommand(query, cn)) 
       { 
        using (SqlDataAdapter adapter = new SqlDataAdapter()) 
        { 
         using (DataTable table = new DataTable()) 
         { 
          cn.Open(); 

          using (BindingSource bs = new BindingSource()) 
          { 
           adapter.SelectCommand = cmd; 

           adapter.Fill(table); 

           bs.DataSource = table; 

           gridview.DataSource = bs.DataSource; 
          } 

          cn.Close(); 
         } 
        } 
       } 
      } 
     } 

     private void btnUpdate_Click(object sender, EventArgs e) 
     { 
      using (BindingSource bs = new BindingSource()) 
      { 
       bs.DataSource = gridview.DataSource; 

       using (DataTable table = new DataTable()) 
       { 
        using(SqlDataAdapter adpt = new SqlDataAdapter()) 
        { 
         bs.DataSource = gridview.DataSource; 

         /// ALL OF MY WORK IS FAILING FROM HERE ON /// 
         /// WANT TO GET UPDATE TO WORK HERE: /// 
         /// 

         ///adpt.Update(bs.DataSource); 

        } 
       } 
      } 

     } 
    } 
} 

ответ

0

Я понял, вам просто нужно установить частные экземпляры SqldataAdapter и BindingSource. Тогда один случай узнает о другом. Кроме того, я не должен использовать ссылку (используя). В большинстве случаев это разумный выбор, поскольку он реализует метод dispose, но в этом случае мне нужен другой метод, чтобы увидеть экземпляр, который я объявил в совокупности. Ответ Я сделал (это НЕ РАБОТАЕТ с несколькими таблицами или таблицами, где вы не определяете первичный ключ).

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Data.SqlClient; 

namespace TestEntryForm 
{ 
    public partial class Form1 : Form 
    { 
     private BindingSource bs = new BindingSource(); 
     private SqlDataAdapter da = new SqlDataAdapter(); 
     private string cnc = "Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Test;Data Source=localhost"; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      datadridview.DataSource = bs; 
     } 

     private void SelectCommand(string selectcmd) 
     { 
      da = new SqlDataAdapter(selectcmd, cnc); 

      SqlCommandBuilder commandBuilder = new SqlCommandBuilder(da); 

      DataTable table = new DataTable(); 

      table.Locale = System.Globalization.CultureInfo.InvariantCulture; 
      da.Fill(table); 
      bs.DataSource = table; 

      datadridview.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader); 

     } 

     private void btnLoad_Click(object sender, EventArgs e) 
     { 
      SelectCommand(txtQuery.Text); 
     } 

     private void btnUpdate_Click(object sender, EventArgs e) 
     { 
      da.Update((DataTable)bs.DataSource); 
     } 
    } 
} 
0

Может быть, я неправильно понял ваш вопрос. Не стесняйтесь исправить, если это так. Из того, что я собираю, вам требуется очень постоянное соединение для вашего приложения в вашей базе данных. То есть, если что-то изменяется в одном экземпляре вашего приложения, другой экземпляр должен автоматически знать об изменении и обновлять его представление базовых данных.

Если мое понимание вашего вопроса верное, к сожалению, нет прямого решения. То, что вы показываете в своей сетке в одном экземпляре вашего приложения, является представлением IN MEMORY (в вашем случае объектом DataTable) базовыми данными, которые были заполнены значениями базы данных. В TIME вызывается метод «btnPopulate_Click». Любые изменения в базе данных после этого НЕ прозрачны для вашего экземпляра до тех пор, пока базовый datatable не будет обновлен снова.

+0

Хммм, что странно то, потому что вы можете автоматически синхронизировать таблицу, когда вы просто идти (предполагая, что Visual Studio 2010 Professional по умолчанию) 1. Меню данных> Добавить новые данные 2. База данных 3. DataSet 4. Конфигурация подключения к DB. 5. Сохраните настройки. 6. Выберите объекты для использования (таблицы, функции, procs) и т. Д. 7. Сохраните настройки. 8. Выберите «Настройки» в данный момент (Источники данных) Shift + Alt + D 9. Параметры перетаскивания. 10. Обычно это приведет к появлению панели меню с иконкой сохранения, которая сообщит базе данных, когда вы нажмете значок сохранения, что нужно сохранить. Я просто хочу это сделать, но с набором данных не стол. - djangojazz – djangojazz

Смежные вопросы