我正在Visual Basic 2010中编写一个程序.它是一个HMI(人机界面),因此只需要向其他设备发送命令就可以完成任务.因此,有大量的事件处理程序用于单击按钮,这些按钮无法真正分解为模块(除非我对模块的理解是错误的).
从本质上讲,我希望能够将所有事件处理程序,例如按钮按下移动到不同的文件.可以这样做,还是留在"MainWindow.xaml.vb"中很重要?(我的所有按钮都位于一个全屏窗口中,一些按标签隐藏).
谢谢,
--Erik T.
如何在treeview中将子节点添加到特定节点?假设我已经在树视图中有"Item1",如何将"SubItem1"添加到"Item1"作为其子节点?
我知道它可能非常简单,但我尝试了很多东西,我只是不能让它工作.
我们在VB.Net中有几个项目,使用.Net Framework 4和Linq to Entities来处理我们的许多SQL查询.迁移到EF对我们来说是一个新的转变(已经使用了大约4-6个月),并得到了高层管理人员的支持,因为我们可以更快地编写代码.我们仍然使用很多存储过程,但我们甚至也通过Linq到实体执行这些过程.
我希望清除一些混乱,我找不到一个有意义的直接答案.我们有一些查询,我们想要特定字段具有NULL值的记录.这些是简单的选择查询,没有聚合或左连接等.Microsoft建议查询看起来像这样的MSDN链接:
dim query = from a in MyContext.MyTables
Where a.MyField = Nothing
Select a
Run Code Online (Sandbox Code Playgroud)
我有几个项目,我正是这样做的,它工作得很好,在IDE中没有警告.最近,另一个开发人员创建了一个新项目,当他像上面那样进行空检查时,我们都在IDE中收到此警告:
警告1此表达式将始终计算为Nothing(由于equals运算符的空传播).要检查值是否为null,请考虑使用"Is Nothing".
比较项目,每个都有选项显式和选项严格.如果我们忽略警告,我们会在应用程序运行时获得我们正在寻找的确切记录集.如果我将=符号更改为IS,则警告消失.但为什么这个警告出现在一个项目而不是其他项目?即使在MSDN上也有使用equals运算符的例子,这令人困惑.
我正在尝试使用Dynamic Linq进行一些测试,但是对它不熟悉,我遇到了麻烦.
目前我有一个DataTable对象,我已经通过SQL查询填充到数据库.现在我想在这个DataTable上执行动态linq查询.这可能看起来不合逻辑,但我的最终目标是能够在由两个不同数据库填充的两个不同的DataTable上执行连接,所以考虑到这一点,我希望它更有意义.在我继续解决这个主要问题之前,我正在尝试理解一个更简单的情况并进行一些实验.
问题一是我不完全确定IQueryable(Of T)和IEnumerable(Of T)之间的选择.我理解的方式是,如果你在内存中做所有事情,你选择IEnumerable.我认为那适合我的情况,对吗?但是,当我看到更改IQuerbyable中的IEnumerable时(在下面的代码片段中),我惊讶地发现"x.Item(Fieldname)"不起作用!?我错过了什么?它给出的错误是:"后期绑定操作无法转换为表达式树".
无论如何,让我们来看看.我已经有部分工作了:
Dim desc As String = "Description"
Dim status As String = "Status"
Dim query As IEnumerable(Of DataRow) = From x In tab.AsEnumerable()
query = query.Where(Function(x As Object) x.Item(status) < 100)
For Each row As DataRow In query.ToList()
'Do something
Next row
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常.我使用了两个字符串变量,因为最后我想动态决定采用哪个字段.所以,"x!描述"不适合我.但是,现在我想在查询中添加一个投影,即选择一些列.我的期望是这应该是这样的:
query = query.Select(Of String)(Function(x As Object) x.Item(desc))
Run Code Online (Sandbox Code Playgroud)
(注意:我使用Select(Of String),因为这个特定的列具有类型.这当然也应该动态填充)
但是,在InvalidCastException运行时期间失败:"无法转换类型为'WhereSelectEnumerableIterator 2[System.Data.DataRow,System.String]' to type 'System.Collections.Generic.IEnumerable1 [System.Data.DataRow]'的对象." 我真的不明白这里发生了什么; 我猜错了,因为我想返回DataRow,但目前只选择一个字段,恰好是一个字符串.谁能解释/帮助我?
提前致谢!
好的,编辑,因为我应该从头开始提供更多信息:我可以有一个可变数量的where-或select-clauses.我的想法是我可以通过循环包含此信息的列表来动态添加这些.所以我认为我需要IEnumerable提供的.Where()和.Select()函数.
我在使用数据库查询数据时遇到问题,无法在VB.NET中进行报告.我使用业务对象来执行报告.这是我的示例数据:
___________________________________________________________________________
| | | | | | |
| Id | Item | Unit | Unit Price | Quantity | Amount |
|____|_______________|__________|_____________|___________|_______________|
| 1 | Gasoline | L | $ 2.00 | 10 | $ 20.00 |
| 1 | Gasoline | L | $ 2.50 | 20 | $ 50.00 |
| 2 | Water | Bottle | $ 5.00 | 10 | $ 50.00 |
| 3 | Meat | Kg | $ 14.90 | 15 …Run Code Online (Sandbox Code Playgroud) 我可以从外部应用程序文本框中获取文本,但现在我想从外部应用程序中获取所需文本框中的文本.我的英语不太好,这就是为什么看下面的图像.

以下代码仅返回第一个文本框值.
Imports System.Runtime.InteropServices
Public Class Form1
Private Const WM_GETTEXT As Integer = &HD
Declare Auto Function SendMessage Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal msg As Integer, _
ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function FindWindowEx(ByVal parentHandle As IntPtr, _
ByVal childAfter As IntPtr, _
ByVal lclassName As String, _
ByVal windowTitle As String) As IntPtr
End Function
Declare Auto Function FindWindow Lib "user32.dll" (ByVal lpClassName As String, ByVal …Run Code Online (Sandbox Code Playgroud) 我有一个包含许多项目的枚举,我想在VB.NET的select case语句中实现,就像我们在c#.net中一样.
就像在C#.net中一样,我们只需输入switch然后点击Tab键并输入enum变量名,然后点击输入键在case语句中自动枚举的所有enum项.我在VB.net中寻找相同的方式,所以我不需要手动输入所有的情况.
在vb.net中有可能吗?
我需要能够确定在启动应用程序时是否按下了SHIFT或CTRL键
如何为Windows窗体应用程序执行此操作?
我正在开发一个小型UDP控制台来发送一些数据来测试一些GPRS设备,所以我修改了一个我在CodeProject中发现它使用一个线程的例子; 但是当我想要退出应用程序时,我遇到了一个问题,即使我做了类似的事情,treahd也拒绝停止
If UdpOpen Then
ThreadReceive.Abort()
Me.Dispose()
UdpOpen = False
End If
Run Code Online (Sandbox Code Playgroud)
它停在第一个代码行上
Private Sub UdpReceive()
Dim receiveBytes As [Byte]() = receivingUdpClient.Receive(RemoteIpEndPoint) '<--Halt here
IpRemote(RemoteIpEndPoint.Address.ToString)
Dim BitDet As BitArray
BitDet = New BitArray(receiveBytes)
Dim strReturnData As String = System.Text.Encoding.ASCII.GetString(receiveBytes)
If UdpOpen Then
StartUdpReceiveThread(CInt(RemotePortLbl.Text))
End If
PrintLog(strReturnData)
End Sub
Run Code Online (Sandbox Code Playgroud)
所以我做了一些研究,通常在这个网页中找到解决方案 停止阻止程序关闭的线程?
并且,正如第一条评论所述,我转向True isBackground属性并且它有效,现在的问题是为什么?
有人深入了解它的工作原理吗?
有没有人知道在调整 datagridview 行和列大小时禁用出现的行的方法。这条线经常闪烁,所以我宁愿自己画一条实线并禁用默认的实线。
我希望通过绘制自己的粗线(我已经完成),它会绘制在默认闪烁的顶部,但不幸的是,两条线都出现了,闪烁的线通常出现在我的实线的右侧或左侧. 我不认为它是相关的,但是用于绘制下面的线的代码。
Private Sub DataGridView1_Paint(sender As Object, e As PaintEventArgs) Handles DataGridView1.Paint
If resizingColumns = True Then
Dim penRed As Pen
penRed = New Pen(color.Red, 3)
Dim cursorPosition As Integer = Me.DataGridView1.PointToClient(New Point(Cursor.Position.X, Cursor.Position.Y)).X
e.Graphics.DrawLine(penRed, cursorPosition, 0, cursorPosition, Me.DataGridView1.Size.Height)
End If
End Sub
Run Code Online (Sandbox Code Playgroud)
我能想到的唯一另一种选择(我真的不想这样做)是将 AllowUserToResizeColumns 设置为 false(这也会隐藏列大小调整线),然后使用鼠标事件以编程方式调整列大小。
任何帮助或指导将不胜感激。
vb.net-2010 ×10
vb.net ×9
.net ×1
ctrl ×1
datagridview ×1
dynamic ×1
linq ×1
nothing ×1
nullable ×1
readability ×1
shift ×1
sql ×1
sql-server ×1
treeview ×1
winforms ×1