列表框没有填充数据

本文关键字:填充 数据 列表 | 更新日期: 2023-09-27 17:53:07

我已经设置了一个名为lboxsupplier的列表框,我还创建了一个数据适配器,然后用于填充供应商列表框。当我运行表单时,列表框为空。我希望列表框填充供应商ID和公司,然后我将点击填充另一个列表框与产品。

Namespace Pennyburn_Greg
{
public partial class FormProcess : Form
{
    SqlDataAdapter daSupplier;
    DataSet dsPennyburnGreg = new DataSet();
    SqlConnection conn;
    SqlCommand cmdSupplierDetails;
    SqlCommandBuilder cmdBSupplier;
    DataRow drSupplier;
    String connstr, sqlSupplier;
    public FormProcess()
    {
        InitializeComponent();
    }

private void FormProcess_Load(object sender, EventArgs e)
{
    connstr = @"Data Source= arlene-pc; Initial Catalog= PennyburnGreg; Integrated Security=True";
    //dataAdapter for supplier listbox
        sqlSupplier = @"Select* from Supplier";
        conn = new SqlConnection(connstr);
        cmdSupplierDetails = new SqlCommand(sqlSupplier, conn);
        daSupplier = new SqlDataAdapter(cmdSupplierDetails);
        daSupplier.FillSchema(dsPennyburnGreg, SchemaType.Source, "Supplier");
}
    private void filllboxsupplier(string str)
    {
        daSupplier.Fill(dsPennyburnGreg, "Supplier");
        lboxsupplier.DataSource = dsPennyburnGreg.Tables["Supplier"];
        lboxsupplier.DisplayMember = "Company";
        lboxsupplier.ValueMember = "SupplierID";

    }
    }
}

列表框没有填充数据

首先,为什么要调用FillSchema,而应该调用Fill方法来获取数据,如

daSupplier.Fill(dsPennyburnGreg, "Supplier");

一旦你有数据集填充,然后在你的FormProcess_Load()你可以添加数据集作为数据源到列表框,如

lboxsupplier.DataSource = dsPennyburnGreg.Tables["Supplier"]

您需要做的第一件事是稍微松散地耦合UI和数据。试试下面的代码:

// Returns a DataTable of ALL suppliers
private DataTable GetSuppliers()
{
    return GetSuppliers(0);
}
// Returns a DataTable of the given supplier
private DataTable GetSuppliers(int supplierId)
{
    using (var connection = new SqlCommand())
    {
        connection.ConnectionString = @"Data Source= arlene-pc; Initial Catalog= PennyburnGreg; Integrated Security=True";
        using (var command = new SqlCommand())
        {
            connection.Open();
            command.CommandType = CommandType.Text;
            command.Connection = connection;
            if (supplierId == 0)
            { 
                command.commandText = "SELECT * FROM Supplier";
            }
            else
            {
                command.commandText = "SELECT * FROM Supplier WHERE SupplierId=@id";
                command.Parameters.AddWithValue("@id", supplierId);
            }
            using (var adapter = new SqlDataAdapter())
            {
                using (var ds = new DataSet())
                {
                    adapter.SelectCommand = command;
                    adapter.Fill(ds);
                    if (ds.Tables.Count > 0)
                        return ds.Tables[0];
                }
            }
        }
    }
    return null;
}

现在你可以这样做:

lboxsupplier.DataSource = GetSuppliers(int.Parse(lboxsupplier.SelectedValue));
lboxsupplier.DisplayMember = "Company";
lboxsupplier.ValueMember = "SupplierID";

或者如果您需要所有供应商,只需这样做:

lboxsupplier.DataSource = GetSuppliers();
lboxsupplier.DisplayMember = "Company";
lboxsupplier.ValueMember = "SupplierID";

这段代码将提供一些分离。这仍然不是理想的,但比您已有的要好。

您没有对FormProcess_Load中的列表框控件做任何事情,因此当它首次加载时它将为空。我假设你有lboxsupplier_Click绑定到lboxsupplierClick事件?如果是这样,那么您需要在填充Dataset之前单击该列表框(这是一种非常奇怪的用户体验,但如果这确实是您需要的……)。如果lboxsupplier_Click不是事件处理程序,那么您将不得不手动调用它。

如果它仍然没有填充,那么尝试直接对数据库运行您的查询,并确保它返回数据,并具有名为"Company"answers"SupplierID"的列