Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 试图从本地DataTable将ListBox所选项目的总和获取到标签中_Vb.net_Winforms_Visual Studio 2015 - Fatal编程技术网

Vb.net 试图从本地DataTable将ListBox所选项目的总和获取到标签中

Vb.net 试图从本地DataTable将ListBox所选项目的总和获取到标签中,vb.net,winforms,visual-studio-2015,Vb.net,Winforms,Visual Studio 2015,我已经搜索了好几天,寻找任何可能的参考或建议,但我遇到的一切都没有起作用 目标: Imports System.Data Imports System.Configuration Imports System.Data.SqlClient Public Class MainHome Private Function GetData(ByVal sql As String) As DataTable Dim constr As String = "Data Source=

我已经搜索了好几天,寻找任何可能的参考或建议,但我遇到的一切都没有起作用

目标:

Imports System.Data
Imports System.Configuration
Imports System.Data.SqlClient

Public Class MainHome
    Private Function GetData(ByVal sql As String) As DataTable
        Dim constr As String = "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\hartj\Documents\visual studio 2015\Projects\TIMEMATRIX2.0\TIMEMATRIX2.0\TMX.mdf;Integrated Security=True"
        Using con As SqlConnection = New SqlConnection(constr)
            Using sda As SqlDataAdapter = New SqlDataAdapter(sql, con)
                Dim dt As DataTable = New DataTable()
                sda.Fill(dt)
                Dim row As DataRow = dt.NewRow()
                row(0) = 1
                row(1) = "Please Select"
                dt.Rows.InsertAt(row, 0)
                Return dt
            End Using
        End Using
    End Function

    Private Sub MainHome_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        ComboBox1.DataSource = Me.GetData("SELECT  SizeId, SizeName FROM Size")
        ComboBox1.DisplayMember = "SizeName"
        ComboBox1.ValueMember = "SizeId"
        ComboBox2.Enabled = False
        ComboBox3.Enabled = False
    End Sub

    Private Sub ComboBox1_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles ComboBox1.SelectionChangeCommitted
        ComboBox2.DataSource = Nothing
        ComboBox3.DataSource = Nothing
        ComboBox2.Enabled = False
        ComboBox3.Enabled = False
        If ComboBox1.SelectedValue.ToString() <> "0" Then
            Dim sql As String = String.Format("SELECT DetailLevelId, DetailLevelName FROM DetailLevel WHERE SizeId = {0}", ComboBox1.SelectedValue)
            ComboBox2.DataSource = Me.GetData(sql)
            ComboBox2.DisplayMember = "DetailLevelName"
            ComboBox2.ValueMember = "DetailLevelId"
            ComboBox2.Enabled = True
        End If
    End Sub

    Private Sub ComboBox2_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles ComboBox2.SelectionChangeCommitted
        ListBox1.DataSource = Nothing
        ListBox1.Enabled = False
        If ComboBox2.SelectedValue.ToString() <> "0" Then
            Dim sql As String = String.Format("SELECT OperationsId, OperationsName, OperationsTime FROM Operations WHERE DetailLevelId = {0}", ComboBox2.SelectedValue)
            ListBox1.DataSource = Me.GetData(sql)
            ListBox1.ValueMember = "OperationsName"
            ListBox1.ValueMember = "OperationsTime"
            ListBox1.Enabled = True

            Label9.Text = CType(ListBox1.SelectedValue, Integer).ToString
            'Label.Text = CType(cbbank.SelectedItem, DataRowView).Row.Item("Account").ToString
        End IF
    End Sub
用户将在ComboBox1中选择选项,然后确定Combox2中的可用选项,然后在ListBox1中填充操作列表

当用户在ListBox1中选择可用操作时,我需要将输出值(本例中的总时间,以分钟为单位)加在标签中以供显示

中使用的数据存储在本地数据库中。到目前为止,我的组合框和列表框都能正常工作

我正在尝试获取ListBox1中所有选定项目的文本值,以将我表格中的数值(第4列“操作时间”)输出到一个标签中,该标签将显示所有选择的总和(总时间(分钟)

我在其他帖子中尝试过的一些东西:

Imports System.Data
Imports System.Configuration
Imports System.Data.SqlClient

Public Class MainHome
    Private Function GetData(ByVal sql As String) As DataTable
        Dim constr As String = "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\hartj\Documents\visual studio 2015\Projects\TIMEMATRIX2.0\TIMEMATRIX2.0\TMX.mdf;Integrated Security=True"
        Using con As SqlConnection = New SqlConnection(constr)
            Using sda As SqlDataAdapter = New SqlDataAdapter(sql, con)
                Dim dt As DataTable = New DataTable()
                sda.Fill(dt)
                Dim row As DataRow = dt.NewRow()
                row(0) = 1
                row(1) = "Please Select"
                dt.Rows.InsertAt(row, 0)
                Return dt
            End Using
        End Using
    End Function

    Private Sub MainHome_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        ComboBox1.DataSource = Me.GetData("SELECT  SizeId, SizeName FROM Size")
        ComboBox1.DisplayMember = "SizeName"
        ComboBox1.ValueMember = "SizeId"
        ComboBox2.Enabled = False
        ComboBox3.Enabled = False
    End Sub

    Private Sub ComboBox1_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles ComboBox1.SelectionChangeCommitted
        ComboBox2.DataSource = Nothing
        ComboBox3.DataSource = Nothing
        ComboBox2.Enabled = False
        ComboBox3.Enabled = False
        If ComboBox1.SelectedValue.ToString() <> "0" Then
            Dim sql As String = String.Format("SELECT DetailLevelId, DetailLevelName FROM DetailLevel WHERE SizeId = {0}", ComboBox1.SelectedValue)
            ComboBox2.DataSource = Me.GetData(sql)
            ComboBox2.DisplayMember = "DetailLevelName"
            ComboBox2.ValueMember = "DetailLevelId"
            ComboBox2.Enabled = True
        End If
    End Sub

    Private Sub ComboBox2_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles ComboBox2.SelectionChangeCommitted
        ListBox1.DataSource = Nothing
        ListBox1.Enabled = False
        If ComboBox2.SelectedValue.ToString() <> "0" Then
            Dim sql As String = String.Format("SELECT OperationsId, OperationsName, OperationsTime FROM Operations WHERE DetailLevelId = {0}", ComboBox2.SelectedValue)
            ListBox1.DataSource = Me.GetData(sql)
            ListBox1.ValueMember = "OperationsName"
            ListBox1.ValueMember = "OperationsTime"
            ListBox1.Enabled = True

            Label9.Text = CType(ListBox1.SelectedValue, Integer).ToString
            'Label.Text = CType(cbbank.SelectedItem, DataRowView).Row.Item("Account").ToString
        End IF
    End Sub
  • 尝试使用双精度:

             Dim Total As Double = 0
        For Each Time As Integer In ListBox1.SelectedItems
            Total += CDbl(Time.ToString.Substring(Time.ToString.LastIndexOf(",") + 1))
        Next
        Label9.Text = Total.ToString
    
    表格的屏幕截图:

    下面是我的代码:

    Imports System.Data
    Imports System.Configuration
    Imports System.Data.SqlClient
    
    Public Class MainHome
        Private Function GetData(ByVal sql As String) As DataTable
            Dim constr As String = "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\hartj\Documents\visual studio 2015\Projects\TIMEMATRIX2.0\TIMEMATRIX2.0\TMX.mdf;Integrated Security=True"
            Using con As SqlConnection = New SqlConnection(constr)
                Using sda As SqlDataAdapter = New SqlDataAdapter(sql, con)
                    Dim dt As DataTable = New DataTable()
                    sda.Fill(dt)
                    Dim row As DataRow = dt.NewRow()
                    row(0) = 1
                    row(1) = "Please Select"
                    dt.Rows.InsertAt(row, 0)
                    Return dt
                End Using
            End Using
        End Function
    
        Private Sub MainHome_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            ComboBox1.DataSource = Me.GetData("SELECT  SizeId, SizeName FROM Size")
            ComboBox1.DisplayMember = "SizeName"
            ComboBox1.ValueMember = "SizeId"
            ComboBox2.Enabled = False
            ComboBox3.Enabled = False
        End Sub
    
        Private Sub ComboBox1_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles ComboBox1.SelectionChangeCommitted
            ComboBox2.DataSource = Nothing
            ComboBox3.DataSource = Nothing
            ComboBox2.Enabled = False
            ComboBox3.Enabled = False
            If ComboBox1.SelectedValue.ToString() <> "0" Then
                Dim sql As String = String.Format("SELECT DetailLevelId, DetailLevelName FROM DetailLevel WHERE SizeId = {0}", ComboBox1.SelectedValue)
                ComboBox2.DataSource = Me.GetData(sql)
                ComboBox2.DisplayMember = "DetailLevelName"
                ComboBox2.ValueMember = "DetailLevelId"
                ComboBox2.Enabled = True
            End If
        End Sub
    
        Private Sub ComboBox2_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles ComboBox2.SelectionChangeCommitted
            ListBox1.DataSource = Nothing
            ListBox1.Enabled = False
            If ComboBox2.SelectedValue.ToString() <> "0" Then
                Dim sql As String = String.Format("SELECT OperationsId, OperationsName, OperationsTime FROM Operations WHERE DetailLevelId = {0}", ComboBox2.SelectedValue)
                ListBox1.DataSource = Me.GetData(sql)
                ListBox1.ValueMember = "OperationsName"
                ListBox1.ValueMember = "OperationsTime"
                ListBox1.Enabled = True
    
                Label9.Text = CType(ListBox1.SelectedValue, Integer).ToString
                'Label.Text = CType(cbbank.SelectedItem, DataRowView).Row.Item("Account").ToString
            End IF
        End Sub
    
    导入系统数据
    导入系统配置
    导入System.Data.SqlClient
    公营家庭
    私有函数GetData(ByVal sql作为字符串)作为DataTable
    Dim constr As String=“数据源=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\hartj\Documents\visualstudio 2015\Projects\TIMEMATRIX2.0\TIMEMATRIX2.0\TMX.mdf;集成安全性=True”
    使用con作为SqlConnection=newsqlconnection(cont)
    将sda用作SqlDataAdapter=新的SqlDataAdapter(sql,con)
    作为数据表的Dim dt=新数据表()
    sda.填充(dt)
    作为DataRow=dt.NewRow()的Dim行
    行(0)=1
    第(1)行=“请选择”
    dt.行插入符(行,0)
    返回dt
    终端使用
    终端使用
    端函数
    Private Sub MainHome_Load(发送方作为System.Object,e作为System.EventArgs)处理MyBase.Load
    ComboBox1.DataSource=Me.GetData(“从大小中选择SizeId、SizeName”)
    ComboBox1.DisplayMember=“SizeName”
    ComboBox1.ValueMember=“SizeId”
    ComboBox2.Enabled=False
    ComboBox3.Enabled=False
    端接头
    私有子Combox1\u SelectionChangeCommitted(发送方作为对象,e作为事件参数)处理Combox1.SelectionChangeCommitted
    ComboBox2.DataSource=无
    ComboBox3.DataSource=无
    ComboBox2.Enabled=False
    ComboBox3.Enabled=False
    如果ComboBox1.SelectedValue.ToString()为“0”,则
    Dim sql As String=String.Format(“从DetailLevel中选择DetailLevelId,DetailLevelName,其中SizeId={0}”,ComboBox1.SelectedValue)
    ComboBox2.DataSource=Me.GetData(sql)
    ComboBox2.DisplayMember=“DetailLevelName”
    ComboBox2.ValueMember=“DetailLevelId”
    ComboBox2.Enabled=True
    如果结束
    端接头
    私有子Combox2\u SelectionChangeCommitted(发送方作为对象,e作为事件参数)处理Combox2.SelectionChangeCommitted
    ListBox1.DataSource=无
    ListBox1.Enabled=False
    如果ComboBox2.SelectedValue.ToString()为“0”,则
    Dim sql As String=String.Format(“从DetailLevelId={0}的操作中选择OperationsId、OperationsName、OperationsTime”,ComboBox2.SelectedValue)
    ListBox1.DataSource=Me.GetData(sql)
    ListBox1.ValueMember=“操作名称”
    ListBox1.ValueMember=“操作时间”
    ListBox1.Enabled=True
    Label9.Text=CType(ListBox1.SelectedValue,整数).ToString
    'Label.Text=CType(cbbank.SelectedItem,DataRowView).Row.Item(“帐户”).ToString
    如果结束
    端接头
    
    无需从
    数据行视图
    获取
    数据行
    ,因为您可以直接从
    数据行视图
    访问字段值。它可以并且确实做了许多与
    DataRow
    相同的事情

    这是最传统的方式,但也有其他选择。你可以向它扔点大麻:

    Dim totalOperationsTime = ListBox1.SelectedItems.Cast(Of DataRowView)().
                                                     Sum(Function(view) CDbl(view("OperationsTime")))
    
    有点恼人的是,
    ValueMember
    属性只帮助您获取
    SelectedItem
    的值。这是我不久前编写的一个类,它添加了一个
    GetItemValue
    方法,该方法使用
    ValueMember
    的功能与
    GetItemText
    方法对
    DisplayMember
    的功能一样:

    Public Class ListBoxEx
        Inherits ListBox
    
        Public Function GetItemValue(item As Object) As Object
            Dim index = Me.Items.IndexOf(item)
    
            If (index <> -1 AndAlso Me.DataManager IsNot Nothing) Then
                Return Me.FilterItemOnProperty(Me.DataManager.List(index), Me.ValueMember)
            End If
    
            Return Nothing
        End Function
    
    End Class
    
    或者这个:

    Dim totalOperationsTime = ListBox1.SelectedItems.Cast(Of Object)().
                                                     Sum(Function(item) CDbl(ListBoxEx1.GetItemValue(item)))
    

    使用该自定义控件的一个优点是,您不必知道数据源或其项的类型。您只需知道
    ValueMember
    已设置。

    我对您的代码做了一些更改。它与列表框一起工作。有关详细信息,请参见注释

    ' "Please Select" doesn't work well in the ListBox, I added it as an option
    Private Shared Function GetData(ByVal sql As String, insertPleaseSelect As Boolean) As DataTable
        Dim constr As String = "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\hartj\Documents\visual studio 2015\Projects\TIMEMATRIX2.0\TIMEMATRIX2.0\TMX.mdf;Integrated Security=True"
        Using con As SqlConnection = New SqlConnection(constr)
            Using sda As SqlDataAdapter = New SqlDataAdapter(sql, con)
                Dim dt As DataTable = New DataTable()
                sda.Fill(dt)
                If insertPleaseSelect Then
                    Dim row As DataRow = dt.NewRow()
                    row(0) = 1
                    row(1) = "Please Select"
                    dt.Rows.InsertAt(row, 0)
                End If
                Return dt
            End Using
        End Using
    End Function
    
    Private Sub MainHome_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        ComboBox1.DataSource = GetData("SELECT  [SizeId], [SizeName] FROM [Size]", True)
        ComboBox1.DisplayMember = "SizeName"
        ComboBox1.ValueMember = "SizeId"
        ComboBox2.Enabled = False
        ListBox1.SelectionMode = SelectionMode.MultiSimple ' allow multi-select
    End Sub
    
    Private Sub ComboBox1_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles ComboBox1.SelectionChangeCommitted
        ComboBox2.DataSource = Nothing
        ComboBox2.Enabled = False
        If ComboBox1.SelectedValue.ToString() <> "0" Then
            Dim sql As String = String.Format("SELECT [DetailLevelId], [DetailLevelName] FROM [DetailLevel] WHERE [SizeId] = {0}", ComboBox1.SelectedValue)
            ComboBox2.DataSource = GetData(sql, True)
            ComboBox2.DisplayMember = "DetailLevelName"
            ComboBox2.ValueMember = "DetailLevelId"
            ComboBox2.Enabled = True
        End If
    End Sub
    
    Private Sub ComboBox2_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles ComboBox2.SelectionChangeCommitted
        ListBox1.DataSource = Nothing
        ListBox1.Enabled = False
        If ComboBox2.SelectedValue.ToString() <> "0" Then
            Dim sql As String = String.Format("SELECT [OperationsId], [OperationsName], [OperationsTime] FROM [Operations] WHERE [DetailLevelId] = {0}", ComboBox2.SelectedValue)
            ListBox1.DataSource = GetData(sql, False)
            ListBox1.DisplayMember = "OperationsName" ' changed this from ValueMember to DisplayMember
            ListBox1.ValueMember = "OperationsTime"
            ListBox1.Enabled = True
            ListBox1.ClearSelected() ' Every time the ListBox is populated, clear it
        End If
    End Sub
    
    ' Added this handler to respond to user input, not programmatic selection changes
    Private Sub ListBox1_Click(sender As Object, e As EventArgs) Handles ListBox1.Click
        ' Here is the sum
        Label9.Text = ListBox1.SelectedItems.OfType(Of DataRowView).Sum(Function(o) CType(o("OperationsTime"), Double))
    End Sub
    
    ““请选择”在列表框中不起作用,我将其作为选项添加
    私有共享函数GetData(ByVal sql作为字符串,insertPleaseSelect作为布尔值)作为DataTable
    Dim constr As String=“数据源=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\hartj\Documents\visualstudio 2015\Projects\TIMEMATRIX2.0\TIMEMATRIX2.0\TMX.mdf;集成安全性=True”
    使用con作为SqlConnection=newsqlconnection(cont)
    将sda用作SqlDataAdapter=新的SqlDataAdapter(sql,con)
    作为数据表的Dim dt=新数据表()
    sda.填充(dt)
    如果插入,请选择,然后
    作为DataRow=dt.NewRow()的Dim行
    行(0)=1
    第(1)行=“请选择”
    dt.行插入符(行,0)
    如果结束
    返回dt
    终端使用
    终端使用
    端函数
    Private Sub MainHome_Load(发送方作为System.Object,e作为System.EventArgs)处理MyBase.Load
    ComboBox1.DataSource=GetData(“从[Size]中选择[SizeId],[SizeName],True)
    ComboBox1.DisplayMember=“SizeName”
    ComboBox1.ValueMember=“SizeId”
    ComboBox2.Enabled=False
    列表框1.Selecti
    
    Dim totalOperationsTime As Double
    
    For Each item In ListBoxEx1.SelectedItems
        totalOperationsTime += CDbl(ListBoxEx1.GetItemValue(item))
    Next
    
    Dim totalOperationsTime = ListBox1.SelectedItems.Cast(Of Object)().
                                                     Sum(Function(item) CDbl(ListBoxEx1.GetItemValue(item)))
    
    ' "Please Select" doesn't work well in the ListBox, I added it as an option
    Private Shared Function GetData(ByVal sql As String, insertPleaseSelect As Boolean) As DataTable
        Dim constr As String = "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\hartj\Documents\visual studio 2015\Projects\TIMEMATRIX2.0\TIMEMATRIX2.0\TMX.mdf;Integrated Security=True"
        Using con As SqlConnection = New SqlConnection(constr)
            Using sda As SqlDataAdapter = New SqlDataAdapter(sql, con)
                Dim dt As DataTable = New DataTable()
                sda.Fill(dt)
                If insertPleaseSelect Then
                    Dim row As DataRow = dt.NewRow()
                    row(0) = 1
                    row(1) = "Please Select"
                    dt.Rows.InsertAt(row, 0)
                End If
                Return dt
            End Using
        End Using
    End Function
    
    Private Sub MainHome_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        ComboBox1.DataSource = GetData("SELECT  [SizeId], [SizeName] FROM [Size]", True)
        ComboBox1.DisplayMember = "SizeName"
        ComboBox1.ValueMember = "SizeId"
        ComboBox2.Enabled = False
        ListBox1.SelectionMode = SelectionMode.MultiSimple ' allow multi-select
    End Sub
    
    Private Sub ComboBox1_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles ComboBox1.SelectionChangeCommitted
        ComboBox2.DataSource = Nothing
        ComboBox2.Enabled = False
        If ComboBox1.SelectedValue.ToString() <> "0" Then
            Dim sql As String = String.Format("SELECT [DetailLevelId], [DetailLevelName] FROM [DetailLevel] WHERE [SizeId] = {0}", ComboBox1.SelectedValue)
            ComboBox2.DataSource = GetData(sql, True)
            ComboBox2.DisplayMember = "DetailLevelName"
            ComboBox2.ValueMember = "DetailLevelId"
            ComboBox2.Enabled = True
        End If
    End Sub
    
    Private Sub ComboBox2_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles ComboBox2.SelectionChangeCommitted
        ListBox1.DataSource = Nothing
        ListBox1.Enabled = False
        If ComboBox2.SelectedValue.ToString() <> "0" Then
            Dim sql As String = String.Format("SELECT [OperationsId], [OperationsName], [OperationsTime] FROM [Operations] WHERE [DetailLevelId] = {0}", ComboBox2.SelectedValue)
            ListBox1.DataSource = GetData(sql, False)
            ListBox1.DisplayMember = "OperationsName" ' changed this from ValueMember to DisplayMember
            ListBox1.ValueMember = "OperationsTime"
            ListBox1.Enabled = True
            ListBox1.ClearSelected() ' Every time the ListBox is populated, clear it
        End If
    End Sub
    
    ' Added this handler to respond to user input, not programmatic selection changes
    Private Sub ListBox1_Click(sender As Object, e As EventArgs) Handles ListBox1.Click
        ' Here is the sum
        Label9.Text = ListBox1.SelectedItems.OfType(Of DataRowView).Sum(Function(o) CType(o("OperationsTime"), Double))
    End Sub