【问题标题】:Using a dataset to fill listbox使用数据集填充列表框
【发布时间】:2016-06-13 16:36:04
【问题描述】:

在我的 Windows 窗体应用程序中,我试图用数据集中的值填充列表框,但它只是保持为空并且没有给出任何异常。

这是我的代码

        private void FormTeams_load(object sender, EventArgs e)
    {

        try
        {

            DBTeams = new DBConnection();
            conString = Properties.Settings.Default.UserConnectionString;
            DBTeams.connection_string = conString;

            DBTeams.Sql = Properties.Settings.Default.SQL_Teams;

            ds = DBTeams.GetConnection;

            MaxRows = ds.Tables[0].Rows.Count;

            lsb_TeamsTeams.DataSource = ds;
            lsb_TeamsTeams.DisplayMember = "team_name";
            lsb_TeamsTeams.ValueMember = "team_ID";

        }
        catch (Exception err)
        {

            MessageBox.Show(err.Message);

        }

    }

列表框名称为“lsb_TeamsTeams”,数据集名称为“ds”。该表包含 3 列。我希望在此 ListBox 中显示列“team_ID”和“team_name”。

好的,只是想试试我的查询是否会显示在我的第一个表单 Form1 中,我尝试了以下操作。在这里,我尝试用数据库中的第二个表填充第二个数据集,然后尝试将数据传递给 ListBox。

        private void Form1_Load(object sender, EventArgs e)
    {
        try
        {
            secondForm = new FormTeams();

            DBPlayers = new DBConnection();
            conString = Properties.Settings.Default.UserConnectionString;
            DBPlayers.connection_string = conString;

            DBPlayers.Sql = Properties.Settings.Default.SQL_Players;
            ds = DBPlayers.GetConnection;

            DBPlayers.Sql = Properties.Settings.Default.SQL_Teams;
            ds2 = DBPlayer.GetConnection;

            lsb_Teams.DisplayMember = "team_name";
            lsb_Teams.ValueMember = "team_ID";
            lsb_Teams.DataSource = ds2;


            MaxRows = ds.Tables[0].Rows.Count;

            NavigateRecords();

            btn_Save.Enabled = false;
            btn_New.Enabled = true;
            btn_Cancel.Enabled = false;

        }
        catch (Exception err)
        {

            MessageBox.Show(err.Message);

        }
    }

不幸的是,这会引发此错误:Invalid object name 'tbl_Teams'

我不太明白为什么会引发这个错误,我尝试在谷歌上搜索问题,但我只能找到一些关于刷新智能感知缓存的 cmets。我试图在 Visual Studio 2015 Enterprise 中找到它,但没能找到。

这是我使用的数据库连接方法。

        public System.Data.DataSet GetConnection
    {

        get { return MyDataSet(); }

    }

    private System.Data.DataSet MyDataSet()
    {

        System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(strCon);
        con.Open();
        da_0 = new System.Data.SqlClient.SqlDataAdapter(sql_string, con);
        System.Data.DataSet dat_set = new System.Data.DataSet();
        da_0.Fill(dat_set, "Table_Data_1");

        con.Close();

        return dat_set;

    }

所以在尝试通过 SQL Server Management Studio 访问数据库时,我发现我在 Visual Studio 中创建的表在数据库中不存在,这就解释了为什么我收到错误 Invalid object name 'table' 这怎么可能?我相信这与我通过 Visual Studio 创建第二个表的事实有关。不知何故,它确实将它添加到了 Visual Studio 服务器资源管理器中,但没有添加到实际的数据库中。使用 SQL 管理工作室时,我能够创建第二个表,然后我在 C# 中的查询就可以工作了。

但现在下一个问题出现了,填充 ListBox。

我无法在我的 ListBox 中显示任何数据,但我可以在 DataGridView 中显示数据,但我想在 ListBox 中显示它。

我的代码:

        private void Form1_Load(object sender, EventArgs e)
    {
        try
        {
            secondForm = new FormTeams();

            DBPlayers = new DBConnection();
            conString = Properties.Settings.Default.UserConnectionString;
            DBPlayers.connection_string = conString;

            DBPlayers.Sql = Properties.Settings.Default.SQL_Players;
            ds = DBPlayers.GetConnection;

            DBPlayers.Sql = Properties.Settings.Default.SQL_Teams;
            ds2 = DBPlayers.GetConnection;

            //The following lines of code diplay: " System.Data.DataViewManagerList Item TypeDescriptor " in the ListBox.
            lsb_Teams.DisplayMember = "team_name";
            lsb_Teams.ValueMember = "team_ID";
            lsb_Teams.DataSource = ds2.Tables[0];

            //This works, it displays the data from the table.
            dataGridView1.DataSource = ds2.Tables[0];


            MaxRows = ds.Tables[0].Rows.Count;

            NavigateRecords();

            btn_Save.Enabled = false;
            btn_New.Enabled = true;
            btn_Cancel.Enabled = false;

        }
        catch (Exception err)
        {

            MessageBox.Show(err.Message);

        }
    }

我尝试了 .DataSource 行的多个位置,但这没有帮助。我还尝试将其他数据集 ds.tables[0] 中的数据放入 ListBox,然后显示 DisplayMember 列中的数据,但在启动应用程序 cannot bind to the new value member. Parameter name: value 时会引发错误。

【问题讨论】:

    标签: c# listbox dataset waf


    【解决方案1】:

    检查您的数据集的表格是否已填充(使用代码中断)。您需要使用 DataAdapter 来填充数据集,我认为您不会这样做。另外,如果这对您没有帮助,请发布您的 sql 查询。

    【讨论】:

    • 谢谢!该代码中断提示非常有用。我发现我的查询甚至没有运行。在我的主窗体 Form1 中,我使用相同的代码并运行查询 SELECT * FROM tbl_Players。这就像一个魅力。但是,当我尝试重用此代码并尝试使用此查询填充第二个数据集时,SELECT * FROM tbl_Teams Visual Studio 会抛出错误“无效的对象名称't​​bl_Teams'。
    • 您不能将两个数据集中的数据加载到一个列表框中。此外,您将无法在列表框中显示超过两列(除非您使用串联来合并两个字段)。我建议在网格模式下使用列表视图来拥有多列。此外,我会修改 SQL 语句以在两个表上执行 JOIN,并使用生成的数据集填充列表视图。
    • 我不想那样做。我用于在文本框中显示单个记录的第一个数据集,我只希望在我的列表框中显示 2 列,所以这没问题。如果我执行 Join 语句,那么如何过滤出我的 ListBox 所需的结果?
    • 如果您使用的是 WinForms,我认为您不能在列表框中显示两列。
    【解决方案2】:

    你可以使用:

    lsb_TeamsTeams.DataSource = ds.Tables[0];
    

    并检查ds.Tables[0] 是否包含数据。

    您还必须更改第二个查询 DBPlayers.Sql 以从 tbl_Teams 表中获取数据:

    DBPlayers.Sql = Properties.Settings.Default.SQL_Players;
    ds2 = DBPlayer.GetConnection;
    

    因为,您使用相同的 Players 查询来填充 seconde DataSet

    【讨论】:

    • 忘了说我已经试过了。依旧空荡荡的。不过谢谢。
    • MaxRows的值是多少,你确定ds.Tables[0]有数据吗?
    • MaxRows 设置为表 [0] 的行数。在这种情况下 2。但这并不重要,因为我在我的应用程序的另一部分重用了这段代码,现在我什至没有使用 MaxRows(还)。
    • 我不是基于其他任何东西,而是一种感觉,但我现在认为这可能与这是第二种形式的事实有关?因为尝试此代码` if (ds.Tables[0].Rows.Count > 0) { MessageBox.Show("Error"); } ` 实际上并没有弹出 MessageBox
    • 所以列表框是空的,因为ds.Tables[0]没有数据!
    猜你喜欢
    • 2021-02-13
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多