在VB.Net Windows应用程序中,我通过早期绑定创建一个Excel对象,并使用从SQL返回的行填充电子表格。
目的是允许用户从电子表格中选择1行或更多行,捕获select事件,然后从所选行中检索所有数据以供进一步处理。我知道如果我使用SQL数据填充datagridview但用户坚持使用Excel会很简单。
虽然我已经搜索过,但我无法发现是否可以在.Net中捕获选择事件。
如果有可能,请告诉我如何或给我一个关于这个主题的好文章的链接。如果没有,请告诉我。
谢谢!
感谢破败,迈克。我会做更多的研究,因为我有一个良好的基础开始。我的用户将在电子表格中做各种事情:1)选择行进行进一步处理(路由操作);可能是非连续的2)如果操作未出现在输入中(未路由操作),则添加行,然后选择它们。 3)可能添加列数据(我想限制此功能,但用户是老板....)
我会试验,但你能告诉我如何区分行选择和列选择;即我要回应的选择变更和我不回应的选择变更?
答案 0 :(得分:4)
您正在寻找“SelectionChange”活动。有三个相关事件:Worksheet.SelectionChange
,Workbook.SheetSelectionChange
和Application.SheetSelectionChange
。
我认为,出于您的目的,使用Worksheet.SelectionChange
可能是您想要的,因为您已经知道您感兴趣的哪个工作表,但这是一个使用所有三个作为示例的示例:
Public Class ExcelEventHandlingClass
Dim WithEvents xlApp As Excel.Application
Dim WithEvents myWorkbook As Excel.Workbook
Dim WithEvents myWorksheet As Excel.Worksheet
Sub New()
xlApp = New Excel.Application
xlApp.Visible = True
myWorkbook = xlApp.Workbooks.Add
myWorksheet = CType(myWorkbook.Worksheets.Add, Excel.Worksheet)
End Sub
Private Sub xlApp_SheetSelectionChange( _
ByVal Sh As Object, _
ByVal Target As Excel.Range) _
Handles xlApp.SheetSelectionChange
MessageBox.Show( _
"xlApp_SheetSelectionChange: " & _
Target.Address(External:=True) & " was selected")
End Sub
Private Sub myWorkbook_SheetSelectionChange( _
ByVal Sh As Object, _
ByVal Target As Excel.Range) _
Handles myWorkbook.SheetSelectionChange
MessageBox.Show( _
"myWorkbook_SheetSelectionChange: " & _
Target.Address(External:=True) & " was selected")
End Sub
Private Sub myWorksheet_SelectionChange( _
ByVal Target As Excel.Range) _
Handles myWorksheet.SelectionChange
MessageBox.Show( _
"myWorksheet_SelectionChange: " & _
Target.Address(External:=True) & " was selected")
End Sub
End Class
您可以按如下方式运行上述内容:
Dim o As ExcelEventHandlingClass
Private Sub StartExample()
o = New ExcelEventHandlingClass
End Sub
在此示例中,如果更改活动工作表上的选择,则会触发所有三个事件处理程序,并且您将获得3个消息框。这有点烦人,哈哈,但它证明了重点。
当然,您不必使用WithEvents
来连接事件处理程序,而是可以使用AddHandler:
AddHandler xlApp.SheetSelectionChange, AddressOf xlApp_SheetSelectionChange
AddHandler myWorkbook.SheetSelectionChange, AddressOf myWorkbook_SheetSelectionChange
AddHandler myWorksheet.SelectionChange, AddressOf myWorksheet_SelectionChange
调用处理程序后,它可以使用自动化提取值。您可以使用Range.Value
属性从单个单元格中获取值,或从多单元格范围返回2维值范围。当然,根据选择,你可以再次运行SQL,一旦你知道你想要哪一行,但我只是想我会指出你可以直接提取单元格值。
希望这有帮助!
麦克
编辑:更新到Melody的回复
“非常感谢你的帮助,迈克!”
没问题。 : - )
“我需要深入了解细节 Target.Address(外部:= True) 位。我假设目标包含信息 什么被选中?你能提供吗? 更多信息?它是否封装了一行 行的数量或数量 选择?它是否包含索引或 可用于获取的item属性 在列值?是吗? 外部=真正的论点只是这样说 来自非托管代码,或者是 我的假设不正确?“
这只是一个示例,说明如何报告所选范围的地址。让我们看一下Worksheet.SelectionChange事件处理程序的方法签名:
Private Sub myWorksheet_SelectionChange( _
ByVal Target As Excel.Range) _
Handles myWorksheet.SelectionChange
' Your code goes here...
End Sub
该事件有一个参数,即Target As Excel.Range
参数。 (Application.SheetSelectionChange
和Workbook.SheetSelectionChange
事件有第二个参数说明选择更改发生在哪个工作表上,但在Worksheet.Selection
更改事件的情况下,我们已经知道选择更改发生在哪个工作表上,所以省略了参数。)
关键是你可以利用Target As Excel.Range
参数来确定你想要的东西。获取本地地址,包括范围地址,但不包括工作表地址(例如“A1:C3”):
Dim localAddress As String = Target.Address
获取完整路径地址(例如“[Book1.xls] Sheet1!A1:C3”):
Dim localAddress As String = Target.Address(External:=True)
获取所选行数:
Dim numRows As Integer = Target.Rows.Count
要获取工作表上的行索引(请记住:Excel工作表使用Base 1寻址!)作为范围的第一行:
Dim topRowIndex As Integer = Target.Row
获取最后一行的行索引:
Dim lastRowIndex As Integer = Target.Rows(Target.Rows.Count).Row
这些只是一些例子。您必须使用Excel VBA帮助文件(或Google)来获取有关Range类成员的更多信息。
由于假期我可能无法做到 马上回应你,但我是 感谢你的帮助。
散漫。开玩笑,周末愉快。 : - )