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


private void AddEditVisit(int? id)
{
    var frm = new Form
    {
        Text = id == -1 ? "Добавить приём" : "Редактировать приём",
        Size = new Size(550, 520),
        StartPosition = FormStartPosition.CenterParent,
        BackColor = Color.FromArgb(30, 30, 30),
        ForeColor = Color.White
    };

    int y = 30;

    // Пациент
    Label lblPatient = new Label { Text = "Пациент:", Location = new Point(20, y), AutoSize = true, ForeColor = Color.White };
    ComboBox cmbPatient = new ComboBox
    {
        Location = new Point(20, y + 20),
        Width = 400,
        DropDownStyle = ComboBoxStyle.DropDownList,
        BackColor = Color.FromArgb(55, 55, 55),
        ForeColor = Color.White
    };
    DataTable dtPatients = DatabaseHelper.GetAllPatients();
    cmbPatient.DataSource = dtPatients;
    cmbPatient.DisplayMember = "Фамилия";
    cmbPatient.ValueMember = "id_patient";
    frm.Controls.Add(lblPatient);
    frm.Controls.Add(cmbPatient);
    y += 60;

    // Дата
    Label lblDate = new Label { Text = "Дата приёма:", Location = new Point(20, y), AutoSize = true, ForeColor = Color.White };
    DateTimePicker dtpDate = new DateTimePicker
    {
        Location = new Point(20, y + 20),
        Width = 200,
        Format = DateTimePickerFormat.Short,
        BackColor = Color.FromArgb(55, 55, 55),
        ForeColor = Color.White
    };
    frm.Controls.Add(lblDate);
    frm.Controls.Add(dtpDate);
    y += 60;

    // Время
    Label lblTime = new Label { Text = "Время:", Location = new Point(20, y), AutoSize = true, ForeColor = Color.White };
    DateTimePicker dtpTime = new DateTimePicker
    {
        Location = new Point(20, y + 20),
        Width = 120,
        Format = DateTimePickerFormat.Time,
        ShowUpDown = true,
        BackColor = Color.FromArgb(55, 55, 55),
        ForeColor = Color.White
    };
    frm.Controls.Add(lblTime);
    frm.Controls.Add(dtpTime);
    y += 60;

    // Врач
    Label lblDoctor = new Label { Text = "Врач:", Location = new Point(20, y), AutoSize = true, ForeColor = Color.White };
    ComboBox cmbDoctor = new ComboBox
    {
        Location = new Point(20, y + 20),
        Width = 400,
        DropDownStyle = ComboBoxStyle.DropDownList,
        BackColor = Color.FromArgb(55, 55, 55),
        ForeColor = Color.White
    };
    DataTable dtDoctors = DatabaseHelper.GetAllDoctors();
    cmbDoctor.DataSource = dtDoctors;
    cmbDoctor.DisplayMember = "Фамилия";
    cmbDoctor.ValueMember = "id_doctor";
    frm.Controls.Add(lblDoctor);
    frm.Controls.Add(cmbDoctor);
    y += 60;

    // Диагноз
    Label lblDiagnosis = new Label { Text = "Диагноз (необязательно):", Location = new Point(20, y), AutoSize = true, ForeColor = Color.White };
    ComboBox cmbDiagnosis = new ComboBox
    {
        Location = new Point(20, y + 20),
        Width = 400,
        DropDownStyle = ComboBoxStyle.DropDownList,
        BackColor = Color.FromArgb(55, 55, 55),
        ForeColor = Color.White
    };
    DataTable dtDiagnoses = DatabaseHelper.GetAllDiagnoses();
    cmbDiagnosis.DataSource = dtDiagnoses;
    cmbDiagnosis.DisplayMember = "Название";
    cmbDiagnosis.ValueMember = "id_diagnosis";
    cmbDiagnosis.SelectedIndex = -1;
    frm.Controls.Add(lblDiagnosis);
    frm.Controls.Add(cmbDiagnosis);
    y += 60;

    // Анамнез
    Label lblAnamnesis = new Label { Text = "Анамнез:", Location = new Point(20, y), AutoSize = true, ForeColor = Color.White };
    TextBox txtAnamnesis = new TextBox
    {
        Location = new Point(20, y + 20),
        Width = 400,
        Height = 80,
        Multiline = true,
        BackColor = Color.FromArgb(55, 55, 55),
        ForeColor = Color.White,
        BorderStyle = BorderStyle.FixedSingle
    };
    frm.Controls.Add(lblAnamnesis);
    frm.Controls.Add(txtAnamnesis);
    y += 110;

    // Если редактирование – загружаем данные
    if (id != -1)
    {
        var dt = DatabaseHelper.GetAllVisits();
        foreach (DataRow row in dt.Rows)
            if (Convert.ToInt32(row["id_visit"]) == id)
            {
                // ID полей есть в таблице, даже если визуально скрыты
                if (row.Table.Columns.Contains("id_patient"))
                {
                    int patientId = Convert.ToInt32(row["id_patient"]);
                    for (int i = 0; i < cmbPatient.Items.Count; i++)
                    {
                        var item = (DataRowView)cmbPatient.Items[i];
                        if (Convert.ToInt32(item["id_patient"]) == patientId)
                        {
                            cmbPatient.SelectedIndex = i;
                            break;
                        }
                    }
                }

                if (row.Table.Columns.Contains("id_doctor"))
                {
                    int doctorId = Convert.ToInt32(row["id_doctor"]);
                    for (int i = 0; i < cmbDoctor.Items.Count; i++)
                    {
                        var item = (DataRowView)cmbDoctor.Items[i];
                        if (Convert.ToInt32(item["id_doctor"]) == doctorId)
                        {
                            cmbDoctor.SelectedIndex = i;
                            break;
                        }
                    }
                }

                if (row.Table.Columns.Contains("id_diagnosis") && row["id_diagnosis"] != DBNull.Value)
                {
                    int diagnosisId = Convert.ToInt32(row["id_diagnosis"]);
                    for (int i = 0; i < cmbDiagnosis.Items.Count; i++)
                    {
                        var item = (DataRowView)cmbDiagnosis.Items[i];
                        if (Convert.ToInt32(item["id_diagnosis"]) == diagnosisId)
                        {
                            cmbDiagnosis.SelectedIndex = i;
                            break;
                        }
                    }
                }

                if (row.Table.Columns.Contains("Дата") && row["Дата"] != DBNull.Value)
                    dtpDate.Value = Convert.ToDateTime(row["Дата"]);
                if (row.Table.Columns.Contains("Время") && row["Время"] != DBNull.Value)
                    dtpTime.Value = DateTime.Today.Add((TimeSpan)row["Время"]);

                if (row.Table.Columns.Contains("Анамнез"))
                    txtAnamnesis.Text = row["Анамнез"]?.ToString();

                break;
            }
    }

    // Кнопки
    Button btnSave = new Button
    {
        Text = "Сохранить",
        Location = new Point(120, y + 20),
        Width = 120,
        Height = 35,
        DialogResult = DialogResult.OK,
        BackColor = Color.FromArgb(0, 140, 220),
        ForeColor = Color.White,
        FlatStyle = FlatStyle.Flat
    };
    Button btnCancel = new Button
    {
        Text = "Отмена",
        Location = new Point(260, y + 20),
        Width = 120,
        Height = 35,
        DialogResult = DialogResult.Cancel,
        BackColor = Color.FromArgb(70, 70, 70),
        ForeColor = Color.White,
        FlatStyle = FlatStyle.Flat
    };
    frm.Controls.Add(btnSave);
    frm.Controls.Add(btnCancel);
    frm.AcceptButton = btnSave;
    frm.CancelButton = btnCancel;

    if (frm.ShowDialog() == DialogResult.OK)
    {
        if (cmbPatient.SelectedItem == null)
        {
            MessageBox.Show("Выберите пациента!");
            return;
        }
        if (cmbDoctor.SelectedItem == null)
        {
            MessageBox.Show("Выберите врача!");
            return;
        }
        if (string.IsNullOrWhiteSpace(txtAnamnesis.Text))
        {
            MessageBox.Show("Заполните анамнез!");
            return;
        }

        int patientId = (int)((DataRowView)cmbPatient.SelectedItem)["id_patient"];
        int doctorId = (int)((DataRowView)cmbDoctor.SelectedItem)["id_doctor"];
        int? diagnosisId = cmbDiagnosis.SelectedIndex != -1 ? (int?)((DataRowView)cmbDiagnosis.SelectedItem)["id_diagnosis"] : null;
        string anamnesis = txtAnamnesis.Text;

        // Создаём запись в visitrecords (для даты и времени)
        DatabaseHelper.AddVisitRecord(patientId, doctorId, dtpDate.Value, dtpTime.Value.TimeOfDay, "очный");
        var dtRecords = DatabaseHelper.GetAllVisitRecords();
        int recordId = 0;
        if (dtRecords.Rows.Count > 0)
            recordId = Convert.ToInt32(dtRecords.Rows[dtRecords.Rows.Count - 1]["id_record"]);

        if (id == -1)
            DatabaseHelper.AddVisit(recordId, patientId, diagnosisId, null, anamnesis, doctorId);
        else
            DatabaseHelper.UpdateVisit(id.Value, recordId, patientId, diagnosisId, null, anamnesis, doctorId);

        LoadAllData();
        MessageBox.Show("Приём сохранён!");
    }
}