0%

  • 来源:明日科技
  • 提取网页标题

    实例说明

    本实例实现了根据网址提取HTML网页标题的功能。运行程序,在文本框中输入正确的网址,单击”提取”按钮,即可将网页的标题显示在下面的文本框中。运行结果如图1所示。

    图1 提取网页标题

    技术要点

    实现本实例功能主要用到了
    System.Net命名空间下的
    WebRequest类的Create方法、GetResponse方法、
    WebResponse类的GetResponseStream方法、
    StreamReader System.Text.RegularExpressions命名空间下的Regex类的IsMatch方法、Match方法、
    System.IO命名空间下的StreamReader类的ReadLine方法和Stream类。
    System.Net命名空间下的类和方法、system.Text.RegularExpressions命名空间下类和方法在前面已经做过介绍,详细说明请参见实例515。
    这里主要讲解一下Regex类的Match方法、System.IO命名空间下的StreamReader类和Stream类。

    阅读全文 »

  • 来源:明日科技
  • 美化单选按钮控件

    实例说明

    用户使用C#自带的控件制作应用程序时,为了使界面更加美观,更具有特色,可以对控件的样式进行重绘,本实例将对单选按钮控件进行重绘,以用户自定义样式进行显示。实例运行效果如图1所示。

    图1 美化单选按钮控件

    关键技术

    本实例在美化单选按钮控件时,主要是通过重绘单选框实现的,具体实现时,首先需要创建用户控件,然后在用户控件中使用Graphics类的DrawEllipse方法和FillEllipse方法实现重绘单选框操作。下面对本实例中用到的关键技术进行详细讲解。

    阅读全文 »

  • 来源:明日科技
  • DataGridView和BindingSource复合控件

    实例说明

    复合控件是封装在公共容器内的 Windows 窗体控件的集合,这种控件通常称为用户控件,其中包含的子控件称为构成控件。复合控件包含与每个构成控件相关联的所有固有功能,允许程序设计人员有选择地公开和绑定它们的属性。本实例将使用DataGridView控件和BindingSource控件制作复合控件来显示学生档案信息,实例运行效果如图1所示。

    图1 DataGridView和BindingSource复合控件

    关键技术

    本实例实现时主要用到了DataGridView控件和BindingSource组件,下面分别对它们进行详细讲解。
    (1)DataGridView控件
    DataGridView控件,又称为数据表格控件,它提供一种强大而灵活的以表格形式显示数据的方式,可以使用DataGridView控件来显示少量数据的只读视图,也可以对其进行缩放以显示特大数据集的可编辑视图。使用DataGridView控件,可以显示和编辑来自多种不同类型的数据源的表格数据。将数据绑定到DataGridView控件非常简单和直观,在大多数情况下,只需设置DataSource属性即可。另外,DataGridView控件具有极高的可配置性和可扩展性,它提供有大量的属性、方法和事件,可以用来对该控件的外观和行为进行自定义。当需要在Windows窗体应用程序中显示表格数据时,首先考虑使用DataGridView控件。若要以小型网格显示只读值或者使用户能够编辑具有数百万条记录的表,DataGridView控件将提供可以方便地进行编程以及有效地利用内存的解决方案。

    DataGridView控件的常用属性及说明如表1所示。

    表1 DataGridView控件的常用属性及说明

    属性 说明
    AllowUserToAddRows 获取或设置一个值,该值指示是否向用户显示添加行的选项
    AllowUserToDeleteRows 获取或设置一个值,该值指示是否允许用户从DataGridView中删除行
    AlternatingRowsDefaultCellStyle 获取或设置应用于DataGridView的奇数行的默认单元格样式
    ColumnCount 获取或设置DataGridView中显示的列数
    Columns 获取一个包含控件中所有列的集合
    CurrentCell 获取或设置当前处于活动状态的单元格
    CurrentRow 获取包含当前单元格的行
    DataMember 获取或设置数据源中DataGridView显示其数据的列表或表的名称
    DataSource 获取或设置DataGridView所显示数据的数据源
    MultiSelect 获取或设置一个值,该值指示是否允许用户一次选择DataGridView的多个单元格、行或列
    NewRowIndex 获取新记录所在行的索引
    RowCount 获取或设置DataGridView中显示的行数
    Rows 获取一个集合,该集合包含DataGridView控件中的所有行
    SortOrder 获取一个值,该值指示是按升序或降序对DataGridView控件中的项进行排序,还是不排序

    DataGridView控件的常用事件及说明如表2所示。

    表2 DataGridView控件的常用事件及说明

    事件 说明
    CellClick 在单元格的任何部分被单击时发生
    CellContentClick 在单元格中的内容被单击时发生
    CellContentDoubleClick 在用户双击单元格的内容时发生
    CellDoubleClick 在用户双击单元格中的任何位置时发生
    CellMouseClick 在用户用鼠标单击单元格中的任何位置时发生
    CellMouseDoubleClick 在双击DataGridView中的单元格时发生
    Sorted 在DataGridView控件完成排序操作时发生

    (2)BindingSource组件

    BindingSource组件,又称为数据源绑定组件,它主要用于封装窗体的数据源。
    BindingSource组件的常用属性及说明如表3所示。

    表3 BindingSource组件的常用属性及说明

    属性 说明
    AllowNew 获取或设置一个值,该值指示是否可以使用AddNew方法向列表中添加项
    AllowRemove 获取一个值,它指示是否可从基础列表中移除项
    Count 获取基础列表中的总项数
    Current 获取列表中的当前项
    DataMember 获取或设置连接器当前绑定到的数据源中的特定列表
    DataSource 获取或设置连接器绑定到的数据源
    Item 获取或设置指定索引处的列表元素
    List 获取连接器绑定到的列表
    Position 获取或设置基础列表中当前项的索引
    Sort 获取或设置用于排序的列名称以及用于查看数据源中的行的排序顺序
    SortDirection 获取列表中项的排序方向
    SupportsSearching 获取一个值,它指示数据源是否支持使用Find方法进行搜索
    SupportsSorting 获取一个值,它指示数据源是否支持排序

    BindingSource组件的常用方法及说明如表4所示。

    表4 BindingSource组件的常用方法及说明

    方法 说明
    Add 将现有项添加到内部列表中
    AddNew 向基础列表添加新项
    ApplySort 使用指定的排序说明对数据源进行排序
    Clear 从列表中移除所有元素
    CopyTo 将List中的内容复制到指定数组,从指定索引值处开始
    Find 在数据源中查找指定的项
    GetEnumerator 检索List的一个枚举数
    IndexOf 搜索指定的对象,并返回整个列表中第一个匹配项的索引
    Insert 将一项插入列表中指定的索引处
    MoveFirst 移至列表中的第一项
    MoveLast 移至列表中的最后一项
    MoveNext 移至列表中的下一项
    MovePrevious 移至列表中的上一项
    Remove 从列表中移除指定的项
    RemoveAt 移除此列表中指定索引处的项
    RemoveCurrent 从列表中移除当前项

    设计过程

    (1)打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,命名为ComplexControl。
    (2)在当前项目中添加一个用户控件,将其命名为UserControl1。在用户控件中添加一个DataGridView 控件和一个BindingSource组件,并在DataGridView 控件的Columns属性中添加描述学生信息的字段。
    (3)程序主要代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public void BindData()
    {
    //创建数据库连接对象
    SqlConnection con = new SqlConnection("server=mrwxk\\\wangxiaoke;uid=sa;pwd=;database=db_TomeOne;");
    con.Open(); //打开数据库连接
    SqlDataAdapter sda = new SqlDataAdapter("Select * From tb_Student", con); //创建桥接器对象
    DataTable dt = new DataTable(); //创建DataTable对象
    try
    {
    sda.Fill(dt); //填充DataTable
    }
    catch (Exception ex)
    {
    throw ex; //抛出异常
    }
    bindingSource1.DataSource = dt; //指定BindingSource数据源
    dataGridView1.DataSource = bindingSource1; //将BindingSource指定给DataGridView
    }

    秘笈心法

    心法领悟010:使DataGridView单元格中的内容换行!
    通过设置DataGridView控件的DefaultCellStyle属性的WrapMode属性可以实现单元格文本换行功能,代码如下:

    dataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.True;

  • 来源:明日科技
  • 读取多个文本文件到同一Word文档中


    实例说明

    读取多个文本文件到同一个Word文档中的实现方法与读取单个文本文件到Word文档基本相同,先根据用户选择的文本文件集合使用StreamReader读取每一个文本文件的文本内容,然后将所有文本文件的内容写入Word文档。实例运行效果如图1所示。

    图1 读取多个文本文件到同一Word文档中
    实例运行中单击”浏览”按钮,会将用户所选择文本文件的路径放入文件列表中,后期可以遍历文件列表使用StreamReader依次读取每一个文本文件的内容到Word文档中,多个文本文件如图2、3、4和5所示。

    图2 第一个文本文件

    图3 第二个文本文件

    图4 第3个文本文件

    图5 第4个文本文件 实例运行中单击”创建Word文档”按钮,首先会创建一个Word文档,然后将多个文本文件的内容写入文本文档。被写入多个文本文件内容的Word文档如图6所示。

    图6 被写入多个文本文件内容的Word文档

    关键技术

    本实例在实现时,主要用到了StreamReader对象依次读取用户指定的文本文件集合中的字符串信息,并将字符串信息写入到Word文档。

    设计过程

    (1)打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,命名为Multi-TxtToWord。
    (2)使用C#操作Word文档,需要引用相关的COM组件,引用COM组件的步骤请参照实例”创建Word文档”中的设计过程。
    (3)更改默认窗体Form1的Name属性为Frm_Main,更改Text属性为”读取多个文本文件到同一Word文档中”,向窗体中添加一个ListBox控件,用于显示文本文件的集合;向窗体中添加4个Button按钮,按钮分别用于向ListBox中添加文本文件路径、选择Word文档保存路径、创建Word文档和显示Word文档。
    (4)程序主要代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    private void btn_New_Click(object sender, EventArgs e)
    {
    btn_New.Enabled = false; //停用创建按钮
    ThreadPool.QueueUserWorkItem( //使用线程池
    (P_temp) =>//使用lambda表达式
    {
    G_wa = new Word.Application();//创建Word应用程序对象
    Word.Document P_wd = G_wa.Documents.Add(//创建新文档
    ref G_missing, ref G_missing, ref G_missing, ref G_missing);
    Word.Range P_Range = P_wd.Paragraphs[1].Range;//得到文档段落范围
    foreach (string s in G_List_FileName) //遍历文件集合
    {
    using (StreamReader P_StreamReader = //创建文件读取器对象
    new StreamReader(s, Encoding.Default))
    {
    P_Range.Text += P_StreamReader.ReadToEnd(); //读取文本到Word文档
    }
    }
    G_str_path = string.Format(//计算文件保存路径
    @"{0}\\{1}", G_FolderBrowserDialog.SelectedPath,
    DateTime.Now.ToString("yyyy年M月d日h时s分m秒fff毫秒") + ".doc");
    P_wd.SaveAs( //保存Word文件
    ref G_str_path,
    ref G_missing, ref G_missing, ref G_missing, ref G_missing,
    ref G_missing, ref G_missing, ref G_missing, ref G_missing,
    ref G_missing, ref G_missing, ref G_missing, ref G_missing,
    ref G_missing, ref G_missing, ref G_missing);
    ((Word._Application)G_wa.Application).Quit( //退出应用程序
    ref G_missing, ref G_missing, ref G_missing);
    this.Invoke(//开始执行窗体线程
    (MethodInvoker)(() =>//使用lambda表达式
    {
    btn_Display.Enabled = true; //启用显示按钮
    MessageBox.Show("添加文档成功!", "提示!"); //弹出消息对话框
    }));
    });
    }

    秘笈心法

    心法领悟013:合理使用StreamReader对象的ReadToEnd方法!
    使用StreamReader对象的ReadToEnd方法可以方便的一次性全部读取出文本文件的所有文本信息,适当的使用此方法会使文件操作更加便捷。

  • 来源:明日科技
  • 利用Excel对数据进行多表计算


    实例说明

    本实例使用C#代码实现了利用Excel对数据进行多表计算的功能。运行本实例,如图1所示,首先单击上面工具栏中的“打开Excel模板”按钮,打开指定的Excel模板文件,并且选择要操作的工作表;然后在下面的工具栏中输入要计算的列和行,单击“合并计算”按钮,程序自动对Debug文件夹中的3个Excel文件进行合并计算,并体现在Excel模板文件中。

    图1 利用Excel对数据进行多表计算

    关键技术

    本实例在实现对多个Excel工作表中的内容进行计算时,首先需要有一个固定的模板,以便使用户知道要对哪行哪列数据进行计算,然后需要使用Microsoft Excel自动化对象模型中的Range对象(使用Worksheet对象的Cells属性获得)的Text属性获取Excel工作表中指定单元格的内容,最后将获取到的内容进行相加,并且写入汇总Excel文件的相应单元格中即可,下面对本实例中用到的关键技术进行详细讲解。
    (1)Worksheet对象的Cells属性 Worksheet对象是公开事件并用作控件的容器的Excel工作表对象,其Cells属性用来获取一个Range对象,该对象表示工作表上的所有单元格(不仅仅是当前正在使用的单元格)。Cells属性语法格式如下:
    [BrowsableAttribute(false)]
    public virtual Range Cells { get; }
    参数说明
    属性值:一个Range对象,表示工作表上的所有单元格(不仅仅是当前正在使用的单元格)。
    (2)Range对象的Text属性 Range对象的Text属性用来获取指定单元格中的内容,其语法格式如下:
    object Text {get;}
    参数说明
    属性值:指定单元格的内容。

    设计过程

    (1)打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,命名为CalMultiSheet。
    (2)更改默认窗体Form1的Name属性为Frm_Main,在该窗体中添加两个ToolStrip控件,分别用来作为程序的两个工具栏,其中第一个工具栏用来选择Excel模板文件及其工作表,第二个工具栏用来输入要计算的列、行及执行合并计算操作;添加一个WebBrowser控件,用来显示Excel文件。
    (3)程序主要代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    private void CalcData(int P_int_Row, string P_str_Column)
    {
    CloseProcess("EXCEL"); //关闭所有Excel进程
    string P_str_workBook1 = Application.StartupPath + "\\\Excel1.xls"; //记录第一个要计算的工作簿路径
    string P_str_workBook2 = Application.StartupPath + "\\\Excel2.xls"; //记录第二个要计算的工作簿路径
    string P_str_workBook3 = Application.StartupPath + "\\\Excel3.xls"; //记录第三个要计算的工作簿路径
    string P_str_workBook4 = Application.StartupPath + "\\\Sum.xls"; //记录存储计算结果的工作簿路径
    object missing = System.Reflection.Missing.Value; //定义object缺省值
    //创建Excel对象
    Microsoft.Office.Interop.Excel.ApplicationClass excel1 = new Microsoft.Office.Interop.Excel.ApplicationClass();
    excel1.Visible = false;//设置Excel文件隐藏
    //打开第一个计算的工作簿
    Microsoft.Office.Interop.Excel.Workbook workbook1 = excel1.Workbooks.Open(P_str_workBook1, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);
    //记录要计算的第一个工作表
    Microsoft.Office.Interop.Excel._Worksheet worksheet1 = (Microsoft.Office.Interop.Excel._Worksheet)workbook1.Worksheets.get_Item(tscbox_Sheet.Text);
    //创建Excel对象
    Microsoft.Office.Interop.Excel.ApplicationClass excel2 = new Microsoft.Office.Interop.Excel.ApplicationClass();
    excel2.Visible = false;//设置Excel文件隐藏
    //打开第二个计算的工作簿
    Microsoft.Office.Interop.Excel.Workbook workbook2 = excel2.Workbooks.Open(P_str_workBook2, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);
    //记录要计算的第二个工作表
    Microsoft.Office.Interop.Excel._Worksheet worksheet2 = (Microsoft.Office.Interop.Excel._Worksheet)workbook2.Worksheets.get_Item(tscbox_Sheet.Text);
    //创建Excel对象
    Microsoft.Office.Interop.Excel.ApplicationClass excel3 = new Microsoft.Office.Interop.Excel.ApplicationClass();
    excel3.Visible = false;//设置Excel文件隐藏
    //打开第三个计算的工作簿
    Microsoft.Office.Interop.Excel.Workbook workbook3 = excel3.Workbooks.Open(P_str_workBook3, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);
    //记录要计算的第三个工作表
    Microsoft.Office.Interop.Excel._Worksheet worksheet3 = (Microsoft.Office.Interop.Excel._Worksheet)workbook3.Worksheets.get_Item(tscbox_Sheet.Text);
    //创建Excel对象
    Microsoft.Office.Interop.Excel.ApplicationClass excel4 = new Microsoft.Office.Interop.Excel.ApplicationClass();
    excel4.Visible = false;//设置Excel文件隐藏
    //打开存储计算结果的工作簿
    Microsoft.Office.Interop.Excel.Workbook workbook4 = excel4.Workbooks.Open(P_str_workBook4, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);
    //记录要存储结算结果的工作表
    Microsoft.Office.Interop.Excel._Worksheet worksheet4 = (Microsoft.Office.Interop.Excel._Worksheet)workbook4.Worksheets.get_Item(tscbox_Sheet.Text);
    excel4.DisplayAlerts = false; //设置保存Excel时不显示对话框
    worksheet4.Activate();//激活工作表
    Decimal P_dml_NumOne = 0; //获取第一个工作表的值
    Decimal P_dml_NumTwo = 0; //获取第二个工作表的值
    Decimal P_dml_NumThree = 0; //获取第三个工作表的值
    //判断指定单元格内容是否为空
    if (((Microsoft.Office.Interop.Excel.Range)worksheet1.Cells[P_int_Row, P_str_Column]).Text.ToString() == "" || ((Microsoft.Office.Interop.Excel.Range)worksheet1.Cells[P_int_Row, P_str_Column]).Text == null)
    {
    P_dml_NumOne = 0; //将第一个值设置为0
    }
    else
    {
    P_dml_NumOne = Convert.ToDecimal(((Microsoft.Office.Interop.Excel.Range)worksheet1.Cells[P_int_Row, P_str_Column]).Text); //记录第一个值
    }
    //判断指定单元格内容是否为空
    if (((Microsoft.Office.Interop.Excel.Range)worksheet2.Cells[P_int_Row, P_str_Column]).Text.ToString() == "" || ((Microsoft.Office.Interop.Excel.Range)worksheet2.Cells[P_int_Row, P_str_Column]).Text == null)
    {
    P_dml_NumTwo = 0; //将第二个值设置为0
    }
    else
    {
    P_dml_NumTwo = Convert.ToDecimal(((Microsoft.Office.Interop.Excel.Range)worksheet2.Cells[P_int_Row, P_str_Column]).Text); //记录第二个值
    }
    //判断指定单元格内容是否为空
    if (((Microsoft.Office.Interop.Excel.Range)worksheet3.Cells[P_int_Row, P_str_Column]).Text.ToString() == "" || ((Microsoft.Office.Interop.Excel.Range)worksheet3.Cells[P_int_Row, P_str_Column]).Text == null)
    {
    P_dml_NumThree = 0; //将第三个值设置为0
    }
    else
    {
    //记录第三个值
    P_dml_NumThree = Convert.ToDecimal(((Microsoft.Office.Interop.Excel.Range)worksheet3.Cells[P_int_Row, P_str_Column]).Text);
    }
    Decimal P_dml_Sum = P_dml_NumOne + P_dml_NumTwo + P_dml_NumThree;//计算总和
    try
    {
    //向工作簿的指定单元格中写入计算后的数据
    worksheet4.Cells[P_int_Row, P_str_Column] = P_dml_Sum.ToString();
    workbook4.Save(); //保存Excel文件
    }
    catch
    {
    MessageBox.Show("写入第" + P_int_Row.ToString() + "行,第" + P_str_Column + "列时出错!");
    }
    finally
    {
    workbook4.Save(); //保存Excel文件
    //退出打开的4个Excel文件
    excel1.Quit();
    excel2.Quit();
    excel3.Quit();
    excel4.Quit();
    }
    WBrowser_Excel.Navigate(P_str_workBook4); //在窗体中显示多表计算后的Excel文件
    }

    秘笈心法

    心法领悟050:如何在程序中打开Excel文件?
    打开Excel文件时,可以使用Workbooks对象的Open方法来实现,该方法的第一个参数为要打开的Excel文件,其他的参数表示Excel的相关设置,实际使用时,直接用Missing.Value的值来表示即可。
    例如,本实例中打开指定Excel工作表的实现代码如下:

    Microsoft.Office.Interop.Excel.Workbook workbook1 = excel1.Workbooks.Open(P_str_workBook1, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);

  • 来源:明日科技
  • 利用Excel对数据进行格式转换


    实例说明

    本实例使用C#代码实现了利用Excel对数据进行格式转换的功能。运行本实例,如图1所示,首先选择查询条件,并输入查询关键字,单击“查询”按钮,在Sql Server数据库中执行查询,并将查询结果显示在数据表格控件中;然后单击“Excel格式转换”按钮,将数据表格控件中的查询结果输出到Excel文件中,并对Excel文件中的数据进行格式转换,这里将日期类型转换为长日期格式,数字转换为“000,000.00”格式,字符串格式化为使用双引号括起来,如图2所示。

    图1 利用Excel对数据进行格式转换

    图2 格式转换之后的Excel文件

    关键技术

    本实例在对数据进行格式转换时,主要是通过DataGridViewCell对象的ValueType属性判断DataGridView单元格中的数据类型来实现的,下面对其进行详细讲解。
    DataGridViewCell对象表示DataGridView控件中的单个单元格,其ValueType属性用来获取或设置单元格中值的数据类型,该属性的语法格式如下:
    [BrowsableAttribute(false)]
    public virtual Type ValueType { get; set; }
    参数说明
    属性值:System.Type类型,表示单元格中值的数据类型。

    设计过程

    (1)打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,命名为FormatDataInExcel。
    (2)更改默认窗体Form1的Name属性为Frm_Main,在该窗体中添加一个ComboBox控件,用来选择查询条件;添加一个TextBox控件,用来输入查询关键字;添加一个DataGridView控件,用来显示Sql Server数据库中的数据;添加两个Button控件,分别用来执行数据库查询操作,和将数据库查询结果输出到Excel文件并对不同的列进行格式转换的操作。
    (3)程序主要代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    private void btn_Excel_Click(object sender, EventArgs e)
    {
    if (dgv_Info.Rows.Count == 0)//判断是否有数据
    return;//返回
    //创建Excel对象
    Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
    excel.Application.Workbooks.Add(true); //在Excel中添加一个工作簿
    excel.Visible = true; //设置Excel显示
    //生成字段名称
    for (int i = 0; i < dgv_Info.ColumnCount; i++)
    {
    excel.Cells[1, i + 1] = dgv_Info.Columns[i].HeaderText; //将数据表格控件中的列表头填充到Excel中
    }
    //填充数据
    for (int i = 0; i < dgv_Info.RowCount - 1; i++) //遍历数据表格控件的所有行
    {
    for (int j = 0; j < dgv_Info.ColumnCount; j++)//遍历数据表格控件的所有列
    {
    if (dgv_Info[j, i].ValueType == typeof(string))//判断遍历到的数据是否是字符串类型
    {
    //格式化为字符串类型并填充Excel表格
    excel.Cells[i + 2, j + 1] = "“" + dgv_Info[j, i].Value.ToString().Trim() + "”";
    }
    //判断遍历到的数据是否是16位或者32位数字类型
    else if (dgv_Info[j, i].ValueType == typeof(Int16) || dgv_Info[j, i].ValueType == typeof(Int32))
    {
    //格式化为32位数字类型并填充Excel表格
    excel.Cells[i + 2, j + 1] = Convert.ToInt32(dgv_Info[j, i].Value).ToString("N");
    }
    else if (dgv_Info[j, i].ValueType == typeof(Int64)) //判断遍历到的数据是否是64位数字类型
    {
    //格式化为64位数字类型并填充Excel表格
    excel.Cells[i + 2, j + 1] = Convert.ToInt64(dgv_Info[j, i].Value).ToString("N");
    }
    else if (dgv_Info[j, i].ValueType == typeof(DateTime)) //判断遍历到的数据是否是日期类型
    {
    //格式化为长日期形式并填充Excel表格
    excel.Cells[i + 2, j + 1] = Convert.ToDateTime(dgv_Info[j, i].Value).ToLongDateString();
    }
    else
    {
    excel.Cells[i + 2, j + 1] = dgv_Info[j, i].Value.ToString();//填充Excel表格
    }
    }
    }
    }

    秘笈心法

    心法领悟051:方便的使用“对象初始化器”!
    从C#3.0版本开始,我们可以方便的使用“对象初始化器”对所有的对象进行初始化,对象初始化器允许我们在一条语句中为指定对象的多个字段和属性赋值。实例中使用了对象初始化器初始化对象,并将初始化后的对象添加到集合中。

  • 来源:明日科技
  • 向文件中写入追加数据


    实例说明

    本实例使用StreamWriter类的Write方法实现向文件中写入数据,首先选择要写入数据的文件,然后在窗体下方的TextBox控件中输入要写入的内容,最后单击“写入”按钮写入数据。实例运行效果如图1所示。

    图1 向文件中写入追加数据

    关键技术

    本实例主要用到了StreamWriter类的构造方法和Write方法,下面对本实例中用到的关键技术进行详细讲解。
    (1)StreamReader类的构造方法 该方法实现使用默认编码和缓冲区大小,为指定路径上的指定文件初始化StreamWriter 类的新实例。其语法格式如下:
    public StreamWriter(string path)
    参数说明
    path:要向其中写入的完整文件路径。
    (2)StreamWriter类的Write方法 该方法实现将字符串写入流,该方法的重载形式有多种。本实例的方法如下:
    public override void Write(string value)
    参数说明
    value:要写入流的字符串。如果 value 为空,则不写入任何内容。

    设计过程

    (1)打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,命名为AddDataToFile。
    (2)在默认窗体Form1中添加两个文本框,分别用来显示文件路径和输入要写入文件的内容;添加Button控件,分别用来打开指定文件和向该文件中写入内容。
    (3)程序主要代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    private void button2_Click(object sender, EventArgs e)
    {
    if (String.IsNullOrEmpty(textBox1.Text.Trim()))//若未选择文件
    {
    MessageBox.Show(&quot; 请设置文件 & quot;);
    return;
    }
    if (String.IsNullOrEmpty(textBox2.Text.Trim()))//若未输入要写入文件的内容
    {
    MessageBox.Show(&quot; 请输入要写入的文件内容 & quot;);
    return;
    }
    try
    {
    StreamWriter SWriter = new StreamWriter(textBox1.Text); //创建StreamWriter对象
    SWriter.Write(textBox2.Text); //向文件中写入指定的内容
    SWriter.Close(); //关闭StreamWriter对象和基础流
    MessageBox.Show(&quot; 写入文件成功!&quot;);
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message);
    }
    }

    秘笈心法

    心法领悟008:使用StreamWriter类写文本文件。
    StreamWriter类实现了TextWriter抽象类,常用来向文本文件中写入数据。

  • 来源:明日科技
  • 读取二进制文件中的内容


    实例说明

    本实例实现读取二进制文件中的内容,首先选择要读取的二进制文件,然后程序将该二进制文件的内容输出到窗体下方的TextBox控件中。实例运行效果如图1所示。

    图1 读取二进制文件中的内容

    关键技术

    本实例实现时主要用到了BinaryWriter类的构造方法和ReadInt32方法,下面对本实例中用到的关键技术进行详细讲解。 BinaryWriter类的ReadInt32方法实现从当前流中读取 4 字节有符号整数,并使流的当前位置提升 4 个字节。其声明语法如下:
    public virtual int ReadInt32()
    参数说明
    返回值:从当前流中读取的 4 字节有符号整数。

    设计过程

    (1)打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,命名为ReadBinaryFile。
    (2)在默认窗体Form1中添加两个TextBox控件,分别用来显示文件路径和文件内容;添加两个Button控件,分别用来选择二进制文件和显示二进制文件的内容。
    (3)程序主要代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    private void button2_Click(object sender, EventArgs e)
    {
    if (String.IsNullOrEmpty(textBox1.Text.Trim())) //若文件路径为空
    {
    MessageBox.Show("请选择文件");
    return;
    }
    textBox2.Text = string.Empty;
    try
    {
    //根据指定文件路径创建文件流
    FileStream myStream = new FileStream(textBox1.Text, FileMode.Open, FileAccess.Read);
    BinaryReader myReader = new BinaryReader(myStream); //创建BinaryReader对象以读取二进制文件
    for (int i = 0; i < myStream.Length; i++) //遍历文件流
    {
    textBox2.Text += myReader.ReadInt32();//从当前流中读取 4 字节有符号整数
    }
    myReader.Close(); //关闭当前流
    myStream.Close(); //关闭文件流
    }
    catch { }
    }

    秘笈心法

    心法领悟012:创建只读文件流。
    若要创建一个只读的文件流,则需要把FileStream构造方法的第二个枚举参数值设置为FileMode.Open,另外还需要把该构造方法的第三个枚举参数值设置为FileAccess.Read。

  • 来源:明日科技
  • 异步加载并播放声音文件

    实例说明

    一般情况下,在加载某些文件时,如果都进行同步加载,那么将浪费很多不必要的时间,因为有些文件并不是用户想要的,因此应该实现异步加载,只加载需要的文件。本实例实现了异步加载并播放声音的功能,实例运行结果如图1所示。

    图1 异步加载并播放声音文件

    关键技术

    本实例实现时主要用到SoundPlayer类,该类用来控制.wav文件中的声音播放。在播放.wav文件前,首先定位该文件的位置,此时用到该类的SoundLocation属性,该属性的功能是获取或设置要加载的.wav文件的文件路径或URL。然后用到该类的LoadAsync方法,该方法的作用是使用新线程从流或Web资源中加载.wav文件。下面对本实例中用到的关键技术进行详细的讲解。
    (1)SoundLocation属性 该属性值的类型是System.String,它的作用是从中加载.wav文件的文件路径或URL,如果不存在文件路径,则为String.Empty。默认为String.Empty。其语法格式如下: public string SoundLocation { get; set; }
    (2)LoadAsync方法 该方法用来从流中或者Web资源中异步加载文件,其语法格式如下: public void LoadAsync()
    说明:程序中使用SoundPlayer类时,首先需要在命名空间区域添加System.Media命名空间。

    设计过程

    (1)打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,命名为AsynchronismLoadPlayVoice。
    (2)更改默认窗体Form1的Name属性为Frm_Main,在该窗体中添加一个TextBox控件,用来显示所要播放的文件路径;添加两个Button控件,分别用来打开.wav文件和播放音乐文件。
    (3)程序主要代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    private void play_Click(object sender,EventArgs e)
    {
    try
    {
    SoundPlayer player = new SoundPlayer(); //声明一个控制WAV文件的声音播放文件对象
    player.SoundLocation = path.Text; //指定声音文件的路径
    player.LoadAsync(); //设置播放的方法
    player.Play(); //播放声音文件
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message);
    }
    }

    秘笈心法

    心法领悟008:使用Exception类捕捉异常。
    所有.NET里的异常都可被称为Exception。虽然说异常多种多样,但基本上它们都是Exception。这个说法可以打一个简单比喻,就像是无论黑猫、白猫、花猫,它们都是“猫”一样。

  • 来源:明日科技
  • 制作开机祝福程序


    实例说明

    运行Windows的应用程序有很多种方法,双击程序的快捷方式、双击程序的可执行文件、在命令行模式中输入程序文件名、双击程序的关联文件等都可以运行目标程序,然而Windows中有许多程序需要在开机后自动运行的。当然这样的程序最好不是很多,因为太多会影响Windows启动的速度。本实例将利用C#语言制作一个开机祝福程序。实例运行效果如图1所示。

    图1 制作开机祝福程序

    关键技术

    本实例实现的关键是如何在系统启动时自动运行程序,下面就对其进行详细介绍。 系统启动时自动运行程序有很多种方法,最为常用的一种方法就是利用系统注册表。在注册表中的“HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION \RUN”键下可以添加Windows启动后自动运行的程序,这种方法需要对注册表进行操作,C#中可以使用Registry类来实现,使用该类可以方便的对注册表进行操作,该类中的SetValue方法能够向注册表中添加或修改一个字符串值,其语法格式如下:
    public static void SetValue (string keyName, string valueName,Object value)
    参数说明
    keyName:以有效注册表根(如“HKEY_CURRENT_USER”)开头的键的完整注册表路径。
    valueName:名称/值对的名称。 value:要存储的值。

    设计过程

    (1)打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,命名为BootStrapBeatitude。
    (2)更改默认窗体Form1的Name属性为Frm_Main,在该窗体中添加两个Label控件,分别用来显示当前日期和时间;添加两个Button控件,分别用来显示信息和执行退出程序操作。
    (3)程序主要代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    private void Frm_Main_Load(object sender, EventArgs e)
    {
    GraphicsPath gp = new GraphicsPath(); //初始化一个表示一系列相互连接的直线和曲线的类
    //初始化一个矩形操作区域
    Rectangle rect = new Rectangle(new Point(0, 0), new Size(this.Width, this.Height));
    gp.AddEllipse(rect); //向当前指定的路径下添加一个椭圆
    this.Region = new Region(gp); //设置与此控件关联的窗口区域
    this.label3.Text = DateTime.Now.ToShortDateString(); //在label3控件中显示当前的日期
    this.label5.Text = DateTime.Now.ToShortTimeString(); //在label5中显示当前的时间
    GraphicsPath gpstirng = new GraphicsPath();//初始化一个表示一系列相互连接的直线和曲线的类
    FontFamily family = new FontFamily("宋体");//初始化一个字体样式类
    int fontStyle = (int)FontStyle.Italic; //设置字体的样式类型
    int emSize = 25; //初始化一个emSize变量
    Point origin = new Point(0, 0); //初始化一个有序实数对的实例
    StringFormat format = StringFormat.GenericDefault; //创建一个包含文本布局信息的对象
    gpstirng.AddString("开开心心每一天", family, fontStyle, emSize, origin, format); //向指定的路径添加字符串
    this.button1.Region = new Region(gpstirng); //设置与button1控件关联的窗口区域
    Registry.LocalMachine.CreateSubKey(@"SOFTWARE\\MICROSOFT\\WINDOWS\\CURRENTVERSION\\RUN").SetValue("MyAngel", Application.StartupPath + "\\\Ex05_13.exe", RegistryValueKind.String);//打开注册表中的现有项并设置其中的键值类型
    }

    秘笈心法

    心法领悟017:注册表的使用。
    注册表的层次结构非常类似于文件系统,它记录了用户账号、服务器硬件以及应用程序的设置信息等。同INI文件相比,注册表可以控制的数据更多,而且不仅仅限于处理字符串类型的数据。注册表也包含了一些系统配置的信息,这些信息根据操作系统的不同而不同。用户在“开始”/“运行”里输入regedit后,单击“确定”按钮即可打开注册表编辑器。