0

Есть база данных магазина (3 таблицы). Нужно выводить данные в datagrid, а также в нем же добавлять, обновлять, удалять и искать записи. Сейчас работает только одна таблица. Пытался сделать несколько интерпретаций, но не могу додуматься как это сделать. Чтобы тут не мусорить, заливаю весь код отдельно. То, что помечено комментариями работает, но не так как нужно. К примеру, что пытался сделать через switch не позволяет вводить в ячейки datagrid, вообще поля не открываются. А при загрузке, то что помечено комментариями дает сбой - кнопки добавить и удалить работают, но в базе ничего не обновляется. Прошу строго не судить, знаю быдлокод, но я только учусь) Ссылка на весь код

Как это выглядит XAML форма

namespace WpfApp1
{
    public partial class MainWindow : Window
    {
        string connectionString;
        SqlDataAdapter adapter;
        DataTable stuffTable;
        public MainWindow()
        {
            InitializeComponent();
    connectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
    string sql;
    stuffTable = new DataTable();

    SqlConnection connection = null;
    try
    {
        connection = new SqlConnection(connectionString);
        sql = "SELECT * FROM Stuff";
        SqlCommand command = new SqlCommand(sql, connection);
        adapter = new SqlDataAdapter(command);

        // установка команды на добавление для вызова хранимой процедуры
        adapter.InsertCommand = new SqlCommand("InsertStuff", connection);
        adapter.InsertCommand.CommandType = CommandType.StoredProcedure;
        adapter.InsertCommand.Parameters.Add(new SqlParameter("@FIO", SqlDbType.VarChar, 60, "FIO"));
        adapter.InsertCommand.Parameters.Add(new SqlParameter("@Age", SqlDbType.Int, 0, "Age"));
        adapter.InsertCommand.Parameters.Add(new SqlParameter("@Position", SqlDbType.VarChar, 50, "Position"));
        adapter.InsertCommand.Parameters.Add(new SqlParameter("@Salary", SqlDbType.Float, 0, "Salary"));
        adapter.InsertCommand.Parameters.Add(new SqlParameter("@Rate", SqlDbType.Int, 0, "Rate"));
        SqlParameter parameter = adapter.InsertCommand.Parameters.Add("@Id", SqlDbType.Int, 0, "Id");
        parameter.Direction = ParameterDirection.Output;

        connection.Open();
        adapter.Fill(stuffTable);
        stuffGrid.ItemsSource = stuffTable.DefaultView;

    }

    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    finally
    {
        if (connection != null)
            connection.Close();
    }

}
private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{

}

private void UpdateDB(DataTable table)
{
    SqlCommandBuilder comandbuilder = new SqlCommandBuilder(adapter);
    adapter.Update(table);

}

private void deleteButton_Click(object sender, RoutedEventArgs e)
{
    if (stuffGrid.SelectedItems != null)
    {
        for (int i = 0; i < stuffGrid.SelectedItems.Count; i++)
        {
            DataRowView datarowView = stuffGrid.SelectedItems[i] as DataRowView;
            if (datarowView != null)
            {
                DataRow dataRow = (DataRow)datarowView.Row;
                dataRow.Delete();
            }
        }
    }

    UpdateDB(stuffTable);
}
private void search_Click(object sender, RoutedEventArgs e)
{


    string sql = $"SELECT * FROM Stuff WHERE FIO LIKE '%{dbFind.Text}%' OR Age LIKE '%{dbFind.Text}%' OR" +
        $" Position LIKE '%{dbFind.Text}%' OR Salary LIKE '%{dbFind.Text}%' OR Rate LIKE '%{dbFind.Text}%'";
    stuffTable = new DataTable();
    SqlConnection connection = null;
    try
    {

        popup1.IsOpen = true;
        connection = new SqlConnection(connectionString);
        SqlCommand command = new SqlCommand(sql, connection);
        adapter = new SqlDataAdapter(command);
        DataTable dt = new DataTable();

        stuffGrid_Find.AutoGenerateColumns = true;
        connection.Open();
        adapter.Fill(stuffTable);
        stuffGrid_Find.ItemsSource = stuffTable.DefaultView;
    }

    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    finally
    {
        if (connection != null)
            connection.Close();
    }

}


private void Button_Click(object sender, RoutedEventArgs e)
{
    UpdateDB(stuffTable);
}

}

}

Код выше работает, но только для 1 таблицы. Помогите для еще 2) Достаточно подтолкнуть!

  • Ох, работали бы вы с привязками, сделали бы вы все по MVVM, в разы было бы все проще. А так.... нагородили все в одну кучу, черт ногу сломит... – EvgeniyZ Dec 12 '18 at 14:44
  • @EvgeniyZ, где об этом можно почитать? В C# я новичок, в wpf вообще нуль – Хамро Камалов Dec 12 '18 at 14:53
  • Пытаетесь значит прыгнуть выше головы? Так не стоит делать! Изучите сначала все тонкости языка C#, поймите как он работает, научитесь работать с контролами WPF, поймите что такое привязки, как они работают и дальше все встанет на свои места. Почитать, вон отдельный вопрос для этого есть, либо смотрите видео уроки (благо их много). А то я смотрю вы сразу в базу полезли, не зная толком нечего... – EvgeniyZ Dec 12 '18 at 14:59
  • Посмотрите здесь: https://ru.stackoverflow.com/questions/638541/Динамическая-смена-itemssource-в-tabcontrol-Коллекции-разных-типов. У вас похожий случай. – Vlad Dec 12 '18 at 15:14
  • https://metanit.com/sharp/wpf Вот здесь от А до Я про wpf (и работу с бд тоже) – Anton Nikolaev Dec 12 '18 at 15:25
  • Смысл использовать WPF и работать в стиле WindowsForms? – iluxa1810 Dec 13 '18 at 05:38
  • @EvgeniyZ, да нет, выше головы не прыгаю. Разобраться в кратчайший срок могу. Опыт программирования есть.

    iluxa1810, а вы когда начинали, то сразу все как должно писали?

    – Хамро Камалов Dec 13 '18 at 06:14
  • @TEA, спасибо за ссылку, оттуда то и брал информацию, но не смог размножить на 3 таблицы – Хамро Камалов Dec 13 '18 at 06:16
  • Вы зачем детский труд используете?? – Саске Dec 13 '18 at 13:28

0 Answers0