技术开发 频道

用VS2008开发Office业务应用程序

  客户数据搜索窗体

  将数据源添加到 SalesControlLibrary 项目后,即可以设计搜索客户数据的组件。在我的销售搜索窗体设计器中,已经向项目中添加了多个控件,包括一些标签、字段、连接“销售”数据库的数据网格、一些显示客户联络信息(与数据网格中选定项目对应)的字段。图 6 显示了已添加所有控件的完整窗体。请注意,虽然大部分控件是直接添加的,但是对于数据网格视图,需要首先打开数据源窗格,右键单击“Sales”(销售)数据源并选择详细信息,然后将“Sales”(销售)记录拖放到数据网格视图中。然后右键单击控件,选择“Edit Columns”(编辑列)并删除 SalesYear 和 SalesAmount(如果只对在数据网格视图中显示 CustomerID 和 SalesQuarter 感兴趣)。
 
                                      图 6 构建客户数据用户控件

  此时,已经将新的控件添加到窗体中,并准备向控件添加一些代码。因此让我们看看添加到此窗体的一些关键代码。首先要看的是添加到 SalesSearch 类的声明。具体地说,为“公司”和“销售”声明了一个表适配器,并为所有销售数据更改创建了一个事件处理程序:

namespace SalesControlLibrary
{
  
public partial class SalesSearch : UserControl
  {
    
private SalesDataSetTableAdapters.CompaniesTableAdapter
      companiesAdapter;
    
private SalesDataSetTableAdapters.SalesTableAdapter
      salesAdapter;
    
public event EventHandler<SalesSearchEventArgs>
      SalesDataChangeEvent;
    
    ...
  {    
}

  要触发的主要事件是 executeSearch_click 事件,在单击“Search”(搜索)按钮时启动。它可在 SalesSearch 类中找到,如图 7 所示。

private void executeSearch_Click(object sender, EventArgs e)
{
  
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”(地址)字段,以显示客户的信息。

 

private void CompaniesBindingSource_CurrentChanged(object sender,
  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 方法:

protected virtual void OnSalesDataChanged(string companyName,
  
string[] x, double[] y)
{
  
if (SalesDataChangeEvent != null)
    SalesDataChangeEvent(this,
      
new SalesSearchEventArgs(companyName, x, y));
}

选择发生更改时,OnSalesDataChanged 事件有针对当前记录的公司名称、年份和销售的参数。

0
相关文章