C # - вытащить данные SQL в текстовые поля / метки из изменения выбранного элемента комбинированного списка - PullRequest
0 голосов
/ 17 мая 2019

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

Я хотел бы иметь выпадающий список / выпадающий список, читать sqldb и создавать элементы в соответствии св БД.Затем я хотел бы, чтобы различные текстовые поля заполнялись значением из столбца.

Скажем, моя таблица БД называется "AvSites" (пока только ради), у меня есть "projectNr", "siteName", столбцы "siteClients" и "siteLicenses" Я бы хотел, чтобы каждый из них где-то заполнял какое-то текстовое поле / метку.

Я пробовал следующее, что вроде работает, у меня код работал большую часть времени, но меня поражает то, что данные меняются с выбранным элементом комбинированного списка.

Я надеюсь, что вы можете помочь, и вот мой код (пока у меня есть окно входа в систему до этого "основного")программа запускается, просто чтобы вам не было интересно)

И я довольно новичок в C #, поэтому, если что-то сделано неэффективно, причина :) Я все еще учусь.

namespace AvOverview{

public partial class frmMain : Form
{
    public frmMain()
    {
        InitializeComponent();
    }

    private void Button1_Click(object sender, EventArgs e)
    {
        //btn_LogOut Click Event
        this.Hide();
        Form1 fl = new Form1();
        fl.Show();
    }

    private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
    {
        Application.Exit();
    }

    private void FrmMain_Load(object sender, EventArgs e)
    {
        string cs = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Database1.mdf";

        SqlConnection con = new SqlConnection(cs);
        con.Open();
        string strCmd = "select * from AvSites";
        SqlCommand cmd = new SqlCommand(strCmd, con);
        SqlDataAdapter da = new SqlDataAdapter(strCmd, con);
        DataSet ds = new DataSet();
        da.Fill(ds);
        combo1.ValueMember = "id";
        combo1.DisplayMember = "siteName";
        combo1.DataSource = ds.Tables[0];
        combo1.Enabled = true;
        this.combo1.SelectedIndex = -1;
        cmd.ExecuteNonQuery();
        con.Close();
    }

    private void Combo1_SelectedIndexChanged(object sender, EventArgs e)
    {

                 string cs = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Database1.mdf";
                 string strCmd = "select id from AvSites";
                 SqlConnection con = new SqlConnection(cs);
                 SqlCommand cmd = new SqlCommand(strCmd, con);
                 con.Open();
                 SqlDataReader dr = cmd.ExecuteReader();

                 while (dr.Read())

                 {//this last part is solely for testing if the text changed the way I wanted.

                     label1.Text = dr.GetValue(1).ToString();

                     label2.Text = dr.GetValue(2).ToString();
                     label3.Text = dr.GetValue(0).ToString();
                     label4.Text = dr.GetValue(3).ToString();

1 Ответ

0 голосов
/ 17 мая 2019

Вам не нужно снова вызывать базу данных. Вся информация в текущем выбранном элементе.
Когда вы устанавливаете DataSource вашей комбо в datatable, как вы делаете это в событии click, каждый элемент комбо является DataRowView, и из этого элемента вы можете получить всю информацию, извлеченную из базы данных из вашего исходного запроса

private void Combo1_SelectedIndexChanged(object sender, EventArgs e)
{
     DataRowView rv = Combo1.SelectedItem as DataRowView;
     if(rv != null)
     {
         label1.Text = rv[1].ToString();
         label2.Text = rv[2].ToString();
         label3.Text = rv[0].ToString();
         label4.Text = rv[3].ToString();
     }
}

Примечание: в коде необходимы некоторые улучшения.
Сначала вы должны сохранить строку подключения в файле конфигурации и прочитать ее обратно с помощью класса ConfigurationManager. Читать о Конфигурация в NET
Во-вторых, вы не должны работать с одноразовыми предметами, как сейчас. Одноразовый предмет должен быть утилизирован, как только вы закончили его использовать. В частности, SqlConnection сохраняет ценные системные ресурсы как на вашем компьютере, так и на сервере. Вы должны начать использовать оператор using

string strCmd = "select * from AvSites";
using(SqlConnection con = new SqlConnection(.......))
using(SqlCommand cmd = new SqlCommand(strCmd, con)))
{
    con.Open();
    SqlDataAdapter da = new SqlDataAdapter(strCmd, con);
    DataSet ds = new DataSet();
    da.Fill(ds);
    combo1.ValueMember = "id";
    combo1.DisplayMember = "siteName";
    combo1.DataSource = ds.Tables[0];
    combo1.Enabled = true;
    this.combo1.SelectedIndex = -1;
    // ??? not needed ==> cmd.ExecuteNonQuery();
    // not needed with using ==> con.Close();
}
// Here the connection is closed and disposed and resources are released
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...