Как сохранить данные или значение в текстовом поле на SQL Сервер для выбранной таблицы - PullRequest
0 голосов
/ 04 апреля 2020

Это данные, передаваемые из формы 1 при нажатии кнопки from3:

string DataT1, Table2, T3;
DataTable DT5,DT;

public Form3(DataTable DT4,string DT1, string T2,string T31)
{
            DataT1 = DT1;
            Table2 = T2;
            T3 = T31;
            DT5 = DT4;
            InitializeComponent();
            loaddata();
}

Текстовое поле заполняется автоматически при заполнении таблицы данных данными

 private void FillData(DataTable DataT)
    {
        TextBox TB1;
        int y = 12;
        foreach (DataColumn DC in DataT.Columns)
        {
            TB1 = TB(0, y);
            TB1.DataBindings.Add(new Binding("Text".ToString(), DataT, DC.ColumnName));
            panel1.Controls.Add(TB1);
            y += 23;
        }
    }

        //the textbox object
        private TextBox TB(int x,int y)
        {
            TextBox TB1 = new TextBox 
            { 
                Text = "",
                Size = new Size(150,50),
                Location=new Point(x,y)
            };
            return TB1;
        }

Ниже приведен код что я хочу добавить данные или значение текстового поля на SQL Сервер, когда нажата кнопка сохранения:

private void loaddata()
    {
        DataTable DT1 = new DataTable();
        SqlConnection SC = new SqlConnection(DataT1);
        SqlDataAdapter SDA = new SqlDataAdapter(Table2, SC);
        SqlCommandBuilder SCB = new SqlCommandBuilder(SDA);
        SDA.Fill(DT1);
        DT = DT1;
        dataGridView1.DataSource = DT;
        //the code to save and update data on textbox
        FillData((DataTable)dataGridView1.DataSource);
    }
    private void button1_Click(object sender, EventArgs e)
    {

        int j = 0;
        string[] Text = null;
        foreach (TextBox TB in panel1.Controls)
        {
            j++;
            Text[j].Insert(j, TB.Text.ToString());//this way i create a string[] to save each textbox value
        }
        /*how the code to save programmatically added textbox value to sql
         * database follow by each textbox to each columns in database 
         * table and another sql command to insert new record*/
    }

Это форма1 SQL Строка подключения к серверу

//this is the form one, the database and table is choose by combobox and fill it to datagridview
        string T1, T2, T3;
        DataTable Data2;

        private void LoadData()
        {
            T1 = "Server=localhost;Initial Catalog=" + comboBox2.SelectedItem + ";Integrated Security=SSPI;";
            T2 = "Select * from " + comboBox3.SelectedItem;
            T3 = comboBox3.SelectedItem.ToString();
            SqlConnection SCConnect = new SqlConnection(T1);
            SCConnect.Open();
            StringBuilder SBBuilder = new StringBuilder(T2);
            SqlDataAdapter SDA = new SqlDataAdapter(SBBuilder.ToString(),SCConnect);
            SqlCommandBuilder SCB = new SqlCommandBuilder(SDA);
            DataTable DT = new DataTable();
            SDA.Fill(DT);
            dataGridView1.DataSource = DT;
            Data2 = DT;
            filltexttotextbox((DataTable)dataGridView1.DataSource);
        }

При нажатии кнопки она откроется и передаст данные в форму 3:

        private void button1_Click(object sender, EventArgs e)
        {
            Form3 F3 = new Form3(Data2, T1, T2,T3);
            F3.ShowDialog();
        }

, чтобы добавить новую запись в базу данных

введите описание изображения здесь

для обновления записи в базе данных

введите описание изображения здесь

1 Ответ

0 голосов
/ 04 апреля 2020

Я нашел лучший способ обработать изменения, которые не запускают событие изменений в принципе. Просто сохраните загруженный файл как OriginDataTable и используйте EditorDataTable в качестве редактора.

Для быстрой реализации. Я буду использовать DataGridView в качестве редактора напрямую, без перехода к панели 1. в вашем коде.

    DataTable OriginalDataTable = new DataTable();
    DataTable EditorDataTable = new DataTable();

    public MainForm()
    {
        InitializeComponent();

        EditorDataTable.Columns.Add("Col1");
        EditorDataTable.Columns.Add("Col2");
        EditorDataTable.Columns.Add("Col3");

        EditorDataTable.Rows.Add("my-col-1-row-1", "my-col-2-row-1", "my-col-3-row-1");
        EditorDataTable.Rows.Add("my-col-1-row-2", "my-col-2-row-2", "my-col-3-row-2");
        EditorDataTable.Rows.Add("my-col-1-row-3", "my-col-2-row-3", "my-col-3-row-3");

        dataGridView.DataSource = EditorDataTable;
        OriginalDataTable = EditorDataTable.Copy(); // Save loaded datatable
    }

Тогда я буду использовать сравнение между источником и редактором

    private IEnumerable<DataRow> ListOutDataRowChanged(DataTable originDt, DataTable changeDt)
    {
        for (int i = 0; i < originDt.Rows.Count; i++)
        {
            if (string.Join(";",originDt.Rows[i].ItemArray) != string.Join(";", changeDt.Rows[i].ItemArray))
                yield return originDt.Rows[i];
        }
    }

Кнопка сохранения будет

    private void btnSave_Click(object sender, EventArgs e)
    {
        var list = ListOutDataRowChanged(OriginalDataTable, EditorDataTable);
        MessageBox.Show("List changes count: " + list.Count());
        // Insert this list to SQL here
    }

Преимущество этой реализации:

  • Мы могли бы обработать, когда мы собираемся отправить на SQL
  • Отредактировано, затем восстановление назад не будет учитываться как изменения
  • Нет необходимости запускать событие пожара

enter image description here enter image description here

Откат

enter image description here

...