Загрузка данных


Понял, Visual Studio на русском — ниже те же шаги с русскими названиями пунктов меню и элементов интерфейса.

### Шаг 1. Создание проекта

1. **Файл → Создать → Проект**.
2. Выберите **Приложение Windows Forms (.NET Framework)** (C#).
3. Имя проекта: `ShopApp`, нажмите **Создать**.
4. Убедитесь, что в установщике Visual Studio отмечены компоненты **«Разработка классических приложений .NET»** и **«Обработка и хранение данных»** — иначе не будет шаблонов БД.

### Шаг 2. Создание базы данных

1. **Проект → Добавить новый элемент**.
2. Найдите шаблон **«База данных на основе служб»** (Service-based Database), назовите `ShopDB.mdf`, нажмите **Добавить**.
3. Откройте **Вид → Обозреватель объектов SQL Server** (или **Обозреватель сервера**).
4. Разверните БД, правой кнопкой по **«Таблицы»** → **«Создать запрос»**.
5. Выполните SQL:

```sql
CREATE TABLE Users (
    Id INT PRIMARY KEY,
    Login NVARCHAR(50) NOT NULL,
    Password NVARCHAR(50) NOT NULL
);

CREATE TABLE Products (
    Id INT PRIMARY KEY,
    Article NVARCHAR(20),
    Category NVARCHAR(50),
    Name NVARCHAR(100),
    Price DECIMAL(10,2)
);

CREATE TABLE Orders (
    Id INT IDENTITY(1,1) PRIMARY KEY,
    UserId INT NOT NULL,
    ProductId INT NOT NULL,
    Quantity INT NOT NULL,
    FOREIGN KEY (UserId) REFERENCES Users(Id),
    FOREIGN KEY (ProductId) REFERENCES Products(Id)
);
```

### Шаг 3. Импорт данных из Excel

**Вариант А (проще):** откройте SSMS или **Обозреватель объектов SQL Server**, подключитесь к `(LocalDB)\MSSQLLocalDB` и выполните `INSERT INTO ... VALUES ...` по данным из трёх файлов.

**Вариант Б (программно):** **Сервис → Диспетчер пакетов NuGet → Управление пакетами NuGet для решения**, установите `ClosedXML`, затем читайте Excel из C# и вставляйте строки в БД.

### Шаг 4. Форма входа (LoginForm)

1. В **Обозревателе решений** правой кнопкой по `Form1.cs` → **Переименовать** → `LoginForm.cs`.
2. Разместите на форме:
   - `TextBox` — `txtLogin`
   - `TextBox` — `txtPassword`, свойство **PasswordChar** = `*`
   - `Button` — `btnLogin`, текст «Войти»
3. Дважды щёлкните кнопку — откроется обработчик.

```csharp
using System.Data.SqlClient;

private void btnLogin_Click(object sender, EventArgs e)
{
    string connStr = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\ShopDB.mdf;Integrated Security=True";
    string sql = "SELECT COUNT(*) FROM Users WHERE Login=@login AND Password=@pass";

    using (var conn = new SqlConnection(connStr))
    using (var cmd = new SqlCommand(sql, conn))
    {
        cmd.Parameters.AddWithValue("@login", txtLogin.Text.Trim());
        cmd.Parameters.AddWithValue("@pass", txtPassword.Text.Trim());

        conn.Open();
        int count = (int)cmd.ExecuteScalar();

        if (count > 0)
        {
            var main = new MainForm();
            main.Show();
            this.Hide();
        }
        else
        {
            MessageBox.Show("Неверный логин или пароль");
        }
    }
}
```

### Шаг 5. Главная форма (MainForm)

1. **Проект → Добавить форму Windows Forms**, назовите `MainForm`.
2. Разместите:
   - `DataGridView` — `dataGridView1`
   - `ComboBox` — `cmbView` (элементы: `Товары`, `Заказы`)
   - `ComboBox` — `cmbCategory` (для фильтра по категории)
   - `Button` — `btnFilter`, текст «Поиск»

**Переключение таблиц:**

```csharp
string connStr = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\ShopDB.mdf;Integrated Security=True";

private void cmbView_SelectedIndexChanged(object sender, EventArgs e)
{
    if (cmbView.SelectedItem == null) return;

    string sql;
    if (cmbView.SelectedItem.ToString() == "Товары")
    {
        sql = "SELECT Article AS Артикул, Category AS Категория, Name AS Название, Price AS Цена FROM Products";
    }
    else
    {
        sql = @"SELECT u.Login AS Пользователь, p.Name AS Товар, o.Quantity AS Количество
                FROM Orders o
                JOIN Users u ON o.UserId = u.Id
                JOIN Products p ON o.ProductId = p.Id";
    }

    using (var conn = new SqlConnection(connStr))
    using (var adapter = new SqlDataAdapter(sql, conn))
    {
        var table = new System.Data.DataTable();
        adapter.Fill(table);
        dataGridView1.DataSource = table;
    }
}
```

**Заполнение категорий при загрузке:**

```csharp
private void MainForm_Load(object sender, EventArgs e)
{
    cmbView.Items.AddRange(new[] { "Товары", "Заказы" });
    cmbView.SelectedIndex = 0;

    string sql = "SELECT DISTINCT Category FROM Products";
    using (var conn = new SqlConnection(connStr))
    using (var cmd = new SqlCommand(sql, conn))
    {
        conn.Open();
        using (var reader = cmd.ExecuteReader())
        {
            while (reader.Read())
                cmbCategory.Items.Add(reader.GetString(0));
        }
    }
}
```

**Кнопка поиска по категории:**

```csharp
private void btnFilter_Click(object sender, EventArgs e)
{
    if (cmbCategory.SelectedItem == null) return;

    string sql = "SELECT Article AS Артикул, Category AS Категория, Name AS Название, Price AS Цена " +
                 "FROM Products WHERE Category=@cat";

    using (var conn = new SqlConnection(connStr))
    using (var adapter = new SqlDataAdapter(sql, conn))
    {
        adapter.SelectCommand.Parameters.AddWithValue("@cat", cmbCategory.SelectedItem.ToString());
        var table = new System.Data.DataTable();
        adapter.Fill(table);
        dataGridView1.DataSource = table;
    }
}
```

### Перед запуском

1. Проверьте строку подключения — она должна совпадать с именем вашего `.mdf` и экземпляром LocalDB (Visual Studio обычно записывает её в `App.config`).
2. Загрузите данные в БД **до** запуска — иначе вход не сработает.
3. В `Program.cs` замените `Application.Run(new Form1());` на `Application.Run(new LoginForm());` — иначе форма входа не появится.

Если нужно — распишу вариант Б (парсинг трёх Excel через ClosedXML и вставку в БД) отдельно.