【问题标题】:Listbox isn't populating with Data列表框未填充数据
【发布时间】:2015-06-03 04:45:31
【问题描述】:

我已经设置了一个名为 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";


    }

    }
}

【问题讨论】:

  • 您发布的代码令人困惑。不确定您实际尝试的是什么?
  • 我正在尝试从供应商表中获取公司名称和供应商 ID,并让它们出现在列表框中
  • 你能解释一下为什么你的查询不需要任何参数吗?
  • 首先要做的是在您的方法调用Fill 之后设置一个断点,并确保正在返回数据。接下来要做的是清理你的代码。您的SqlDataAdapterSqlConnectionSqlCommand 等......都应该是局部变量,而不是类范围的变量,并且它们都应该被 using 语句包围。

标签: c# listbox


【解决方案1】:

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

daSupplier.Fill(dsPennyburnGreg, "Supplier");

填充完数据集后,您可以在 FormProcess_Load() 中将数据集作为数据源添加到列表框,如

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

【讨论】:

  • 我现在已经编辑了我的代码,但它仍然没有填充
  • 你设置DisplayMemberValuemember了吗?另外,请检查数据集中存在的数据表是否不为空。这应该可以正常工作。
【解决方案2】:

您需要做的第一件事是稍微松散地耦合您的 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";

此代码将提供一些分隔。这仍然不理想,但胜过你所拥有的。

【讨论】:

    【解决方案3】:

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

    如果仍未填充,请尝试直接对数据库运行查询,并确保它返回数据并包含名为“Company”和“SupplierID”的列

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-13
      • 1970-01-01
      • 2021-03-17
      相关资源
      最近更新 更多