VB.net编程中可能用到的边边角角(一) —— 反射添加Form、向Excel中写值

1.反射添加某Form到另一个Form

(1)新建工程,类型ClassLibrary(名为ClassLibrary1),在工程中添加Item,类型WindowsForm(名为Form1)。

(2)任意编辑Form1,保存,编译工程,找到DLL文件,存放在某位置(C:\Documents and Settings\l\My Documents\Visual Studio 2008\Projects\WindowsApplication2\ClassLibrary1\bin\Debug\ClassLibrary1.dll) 

(3)主界面上Button1作用:将Form1添加到主界面。代码:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim myas As Assembly
        myas = Assembly.LoadFrom("C:\Documents and Settings\l\My Documents\Visual Studio 2008\Projects\WindowsApplication2\ClassLibrary1\bin\Debug\ClassLibrary1.dll"’反射路径,自行修改或存在XML中。
        Dim t As Type = myas.GetType("ClassLibrary1.Form1")
        Dim obj As Object = Activator.CreateInstance(t)

        Dim frm As Form = CType(obj, Form)

        frm.TopLevel = False
        Me.Panel1.Controls.Add(frm) ’主界面上的Panel
        frm.FormBorderStyle = Windows.Forms.FormBorderStyle.None ’去掉Form四周边框,否则太丑,还占地方。。。
        frm.Height = 100
        frm.Width = 500
        frm.Left = 0
        frm.Top = (Me.Panel1.Controls.Count - 1) * 100
        frm.Show()

    End Sub

(4)Button2作用:从后向前删除1个Form1

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Try
            Me.Panel1.Controls.RemoveAt(Me.Panel1.Controls.Count - 1)
        Catch ex As Exception

        End Try
    End Sub

(5)Button3作用:Form1上有三个TextBox(TextBox1,TextBox2,TextBox3),点击后分别计算各个Form1中的TextBox1,TextBox2,TextBox3的总和。

        For i = 0 To Me.Panel1.Controls.Count - 1
            For j = 0 To Me.Panel1.Controls(i).Controls.Count - 1
                If Me.Panel1.Controls(i).Controls(j).Name = "TextBox1" Then
                    If Me.Panel1.Controls(i).Controls(j).Text <> String.Empty Then
                        total1 = total1 + Integer.Parse(Me.Panel1.Controls(i).Controls(j).Text)
                    End If
                ElseIf Me.Panel1.Controls(i).Controls(j).Name = "TextBox2" Then
                    If Me.Panel1.Controls(i).Controls(j).Text <> String.Empty Then
                        total2 = total2 + Integer.Parse(Me.Panel1.Controls(i).Controls(j).Text)
                    End If
                ElseIf Me.Panel1.Controls(i).Controls(j).Name = "TextBox3" Then
                    If Me.Panel1.Controls(i).Controls(j).Text <> String.Empty Then
                        total3 = total3 + Integer.Parse(Me.Panel1.Controls(i).Controls(j).Text)
                    End If
                End If
            Next
        Next

2.向Excel中写值

(代码最上方加上Imports Excel = Microsoft.Office.Interop.Excel)

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Me.SaveXls()
        System.GC.Collect()
    End Sub

    Private Sub SaveXls()
        Dim saveDialog As New SaveFileDialog ’保存Excel路径的Dialog
        saveDialog.FileName = ComboBox1.Text + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls"
        saveDialog.Filter = "xls | *.xls"
        If saveDialog.ShowDialog() = Windows.Forms.DialogResult.OK Then
            Dim xlapp As Excel.Application
            Dim xlwkbook As Excel.Workbook
            Dim xlwksheet As Excel.Worksheet
            xlapp = New Excel.Application
            xlwkbook = xlapp.Workbooks.Open("D:\abc.xls")  ’路径地址自行修改或写在XML中自行读取
            xlwksheet = xlwkbook.Worksheets(5) ’表示表单编号(sheet1,sheet2之类的),编号从1开始
            xlwksheet.Cells(6, 2).Value = nameTextBox.Text ’给第六行,第二列的格赋值(Excel行和列都是1开始)
            xlwksheet.Cells(11, 4).Value = workNameTextBox.Text
            xlwksheet.Cells(13, 4).Value = workPlaceTextBox.Text
            xlwksheet.Cells(15, 3).Value = priceTextBox.Text
            xlwksheet.Cells(26, 5).Value = companyTextBox.Text
            xlwkbook.SaveAs(saveDialog.FileName)
            xlwkbook.Close()
            xlapp.Quit()
            xlapp = Nothing
            xlwkbook = Nothing
            xlwksheet = Nothing
        End If
    End Sub

  在几个文本框中输入值后将值写入对应的Excel的对应Sheet的对应位置。然后保存。将保存方法和垃圾回收分开写可以杀死残留的Excel.exe进程(垃圾回收写在方法中会残留一个进程)。

  明天继续~

 

posted @ 2012-05-23 17:31  逆转反击  阅读(627)  评论(0编辑  收藏  举报