列表框没有填充数据
本文关键字:填充 数据 列表 | 更新日期: 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
绑定到lboxsupplier
的Click
事件?如果是这样,那么您需要在填充Dataset之前单击该列表框(这是一种非常奇怪的用户体验,但如果这确实是您需要的……)。如果lboxsupplier_Click
不是事件处理程序,那么您将不得不手动调用它。
如果它仍然没有填充,那么尝试直接对数据库运行您的查询,并确保它返回数据,并具有名为"Company"answers"SupplierID"的列