繁体   English   中英

如何在C#中使用本地数据库中的数据在textBox中显示列表框项目

[英]How to show listbox item in textBox using data from local database in C#

编程新手,目前正在从事一个项目,该项目使用户可以使用textBoxes将其注册数据输入本地数据库。 该代码的工作原理是将项目添加到数据库中,并在按“ Show_users”按钮后将其显示在listBox_users列表框中。

我的问题是,当我从listBox_users中选择一个名称时,它应该将有关所选用户的数据放在上一个textBox中,我使用我为listBox_users创建的事件首先输入数据,但即时获取错误“无法从已关闭的数据库读取数据”。

namespace Userform
{
public partial class Form1: Form
{
    SqlCeDataReader rdr;

    public Form1()
    {
        InitializeComponent();
    }

    // Some code between...

    private void button_ShowUsers_Click(object sender, EventArgs e) //code that shows users in listBox
    {

        var dt = new DataTable();
        string connectionString2 = @"Data Source=MyDatabase;Password=xxxxxx;";

        using (var cn = new SqlCeConnection(connectionString2))
        using (var cmd = new SqlCeCommand("Select * From Users", cn))
        {
            cn.Open();

            using (var reader = cmd.ExecuteReader())
            {
                dt.Load(reader);
                var results = (from row in dt.AsEnumerable()
                               select new
                               {
                                   //UserID = row.Field<int>("ID"),
                                   FirstName = row.Field<string>("Firsname"),
                                   LastName = row.Field<string>("Lastname"),
                                   FullName = row.Field<string>("Firstname") + " " + row.Field<string>("Lastname")
                               }).ToList();

                listBox_users.DataSource = results;
                listBox_users.DisplayMember = "FullName";

                rdr = cmd.ExecuteReader();
                }
            }
        }

    //I made an event for the listBox_users:

    private void listBox_users_SelectedIndexChanged(object sender, EventArgs e) 
    //event code that should show listbox selected data in the textBoxes
    {            
        if (listBox_inimesed.SelectedItem != null && rdr != null)
        {
            try
            {
                if (rdr.Read())
                {

                    textBox1_firstname.Text = rdr.GetString(1);
                    textBox2_lastname.Text = rdr.GetString(2);
                    textBox3_email.Text = rdr.GetString(3);
                    textBox4_address.Text = rdr.GetString(4);
                    dateTimePicker1.Value = rdr.GetDateTime(5);
                    richTextBox_info.Text = rdr.GetString(6);
                }
                else MessageBox.Show("Object not found");
            }
            finally
            {
                rdr.Close();
            }
        }
    }
}

在button_ShowUsers_Click事件中,您正在使用的阅读器所依赖的连接已关闭。

尝试在事件之间共享连接和DataReader并不是一个好习惯。 这将导致未正确处理的开放连接。 更好的做法是在每个事件方法中创建Connection,Command和DataReader。 通过使用“ using”语句,它们将在每种方法中关闭并正确处理。 您也可以删除类级别变量“ rdr”。

namespace Userform
{
    public partial class Form1 : Form
    {
        const string connectionString2 = @"Data Source=MyDatabase;Password=xxxxxx;";

        public Form1()
        {
            InitializeComponent();
        }

        // Some code between...

        private void button_ShowUsers_Click(object sender, EventArgs e) //code that shows users in listBox
        {
            var dt = new DataTable();

            using (var cn = new SqlCeConnection(connectionString2))
            using (var cmd = new SqlCeCommand("Select * From Users", cn))
            {
                cn.Open();

                using (var reader = cmd.ExecuteReader())
                {
                    dt.Load(reader);
                    var results = (from row in dt.AsEnumerable()
                                   select new
                                   {
                                       //UserID = row.Field<int>("ID"),
                                       FirstName = row.Field<string>("Firsname"),
                                       LastName = row.Field<string>("Lastname"),
                                       FullName = row.Field<string>("Firstname") + " " + row.Field<string>("Lastname")
                                   }).ToList();

                    listBox_users.DataSource = results;
                    listBox_users.DisplayMember = "FullName";
                }
            }
        }

    //I made an event for the listBox_users:

        private void listBox_users_SelectedIndexChanged(object sender, EventArgs e)
        //event code that should show listbox selected data in the textBoxes
        {
            if (listBox_inimesed.SelectedItem != null)
            {
                using (var cn = new SqlCeConnection(connectionString2))
                using (var cmd = new SqlCeCommand("Select * From Users", cn))
                {
                    cn.Open();

                    using (var reader = cmd.ExecuteReader())
                    {
                        if (reader.Read())
                        {
                            textBox1_firstname.Text = reader.GetString(1);
                            textBox2_lastname.Text = reader.GetString(2);
                            textBox3_email.Text = reader.GetString(3);
                            textBox4_address.Text = reader.GetString(4);
                            dateTimePicker1.Value = reader.GetDateTime(5);
                            richTextBox_info.Text = reader.GetString(6);
                        }
                        else MessageBox.Show("Object not found");
                    }
                }
            }
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM