客户数据搜索窗体
将数据源添加到 SalesControlLibrary 项目后,即可以设计搜索客户数据的组件。在我的销售搜索窗体设计器中,已经向项目中添加了多个控件,包括一些标签、字段、连接“销售”数据库的数据网格、一些显示客户联络信息(与数据网格中选定项目对应)的字段。图 6 显示了已添加所有控件的完整窗体。请注意,虽然大部分控件是直接添加的,但是对于数据网格视图,需要首先打开数据源窗格,右键单击“Sales”(销售)数据源并选择详细信息,然后将“Sales”(销售)记录拖放到数据网格视图中。然后右键单击控件,选择“Edit Columns”(编辑列)并删除 SalesYear 和 SalesAmount(如果只对在数据网格视图中显示 CustomerID 和 SalesQuarter 感兴趣)。
图 6 构建客户数据用户控件
此时,已经将新的控件添加到窗体中,并准备向控件添加一些代码。因此让我们看看添加到此窗体的一些关键代码。首先要看的是添加到 SalesSearch 类的声明。具体地说,为“公司”和“销售”声明了一个表适配器,并为所有销售数据更改创建了一个事件处理程序:
{
public partial class SalesSearch : UserControl
{
private SalesDataSetTableAdapters.CompaniesTableAdapter
companiesAdapter;
private SalesDataSetTableAdapters.SalesTableAdapter
salesAdapter;
public event EventHandler<SalesSearchEventArgs>
SalesDataChangeEvent;
...
{
}
要触发的主要事件是 executeSearch_click 事件,在单击“Search”(搜索)按钮时启动。它可在 SalesSearch 类中找到,如图 7 所示。
{
try
{
companiesAdapter = new
SalesDataSetTableAdapters.CompaniesTableAdapter();
CompaniesBindingSource.DataSource =
companiesAdapter.GetDataByCompanyAndIndustry(
companyNameText.Text,
industryText.Text);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Sales Add-in", MessageBoxButtons.OK);
}
}
可以看到它创建了一个 companiesAdapter 的新实例,并调用 GetDataByCompanyAndIndustry 方法,根据用户在搜索字段中输入的参数检索数据(图 8 中的百分号表示一个通配符搜索)。此数据然后用于填充“Contact”(联系人)和“Address”(地址)字段,以显示客户的信息。
EventArgs e)
{
DataRowView company = (DataRowView)(CompaniesBindingSource.Current);
try
{
string[] xData = new string[4];
double[] yData = new double[4];
if (company != null)
{
salesAdapter = new SalesDataSetTableAdapters.SalesTableAdapter();
SalesDataSet.SalesDataTable sales =
salesAdapter.GetDataByCustomerID((int)(company["ID"]));
DataTableReader rdr = sales.CreateDataReader();
int i = 0;
while ((rdr.Read()) && (i < xData.Length) && (i < yData.Length))
{
xData[i] = String.Format("Q{0} {1}",
rdr["SalesQuarter"].ToString(), rdr["SalesYear"].ToString());
yData[i] = Convert.ToDouble(rdr["SalesAmount"]);
i++;
}
OnSalesDataChanged(company["CompanyName"].ToString(),
xData, yData);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Sales Add-in", MessageBoxButtons.OK);
}
}
在此窗体后面的代码中,还有几个帮助程序函数。例如,已经在 CompaniesBindingSource 对象上添加了一个事件,以处理用户通过控件中的销售数据窗体进行浏览的情况(请参见图 8)。
另外,我还添加了一个事件处理程序以处理对销售数据的任何更改。例如,下列代码显示如果绑定源中选择的当前记录发生更改时,所调用 OnSalesDataChanged 方法:
string[] x, double[] y)
{
if (SalesDataChangeEvent != null)
SalesDataChangeEvent(this,
new SalesSearchEventArgs(companyName, x, y));
}
选择发生更改时,OnSalesDataChanged 事件有针对当前记录的公司名称、年份和销售的参数。