【问题标题】:VB.NET Reference new form object's listview from another classVB.NET 从另一个类中引用新表单对象的列表视图
【发布时间】:2013-06-05 13:46:17
【问题描述】:

在表单上,​​我有一个带有上下文菜单的列表视图。

右键单击列表视图项会显示上下文菜单。

当我点击菜单按钮时,我想要发生的事情如下:

会出现一个名为 TaskLog 的表单,它只包含一个列表视图 (这是我的代码):

Private Sub ShowLogToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ShowLogToolStripMenuItem.Click
    logform = New TaskLog()
    logform.task = "taskname"
    logform.server = "servername"
    logform.Show()
End Sub

该列表视图应该在显示之前填充数据库中的数据,因此我在任务日志表单的加载事件中有以下内容

Public Class TaskLog
 Private db As Database = New Database
 Public task As String
 Public server As String

Private Sub TaskLog_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    db.connect()
    db.getTaskLog(task, server, Me)
End Sub
End Class

然后在数据库类 gettask 函数中,我调用数据库,将数据存储在一个对象中,一切正常。这里唯一的问题是我的数据库对象找不到列表视图和表单,即使我将表单作为变量传递给这个函数(frm 作为TaskLog)。

    Public Function getTaskLog(taskname As String, server As String, frm As TaskLog) As Boolean

    'Declare sql command variable
    Dim command As New SqlCommand

    'Try to open db connection
    Try
        connection.Open()
        command.Connection = connection

        'Set query to command object text
        command.CommandText = "select * from tasklog where ltrim(rtrim(server)) Like'" & Trim(server) & "%' and ltrim(rtrim(task)) = '" & Trim(taskname) & "'"
        'Declare data reading pbject
        Dim rdr As SqlDataReader = command.ExecuteReader()

        'Perform operations while rows are returned from database

        While rdr.Read()

            'Store database entry to TaskData Object 
            taskLogData = New TaskData(rdr("frequency").ToString, rdr("start"), rdr("duration"), rdr("delay"), rdr("rescheduled"), rdr("forced"), rdr("task"), rdr("server"), rdr("email"), rdr("message"), rdr("status"), rdr("logtime"))

            Dim new_item As New  _
            ListViewItem(Trim(taskLogData.task_server.ToString))
            new_item.SubItems.Add(Trim(taskLogData.task_name.ToString))
            new_item.SubItems.Add(Trim(taskLogData.task_status.ToString))
            new_item.SubItems.Add(Trim(taskLogData.task_frequency.ToString))
            new_item.SubItems.Add(Trim(taskLogData.task_nextrun.ToString))
            new_item.SubItems.Add(Trim(taskLogData.task_forced.ToString))
            new_item.SubItems.Add(Trim(taskLogData.task_rescheduled.ToString))
            new_item.SubItems.Add(Trim(taskLogData.task_rescheduled.ToString))

            new_item.Group = frm.ListView1.Groups(Trim(taskData.task_status.ToString))

            frm.ListView1.Items.Add(new_item)

        End While

        Return True

    Catch ex As Exception 'If connection fails return error message
        MessageBox.Show("Error while retrieving records on table..." & ex.Message, "Load Records")
        Return True

    Finally 'After connection close database 
        connection.Close()
    End Try

End Function

未设置对象实例的对象引用出现在上述函数的以下行中:

    frm.ListView1.Items.Add(new_item)

有人可以看到问题,并希望有所帮助吗?我尝试了几件事,但仍然不确定在这里做什么最好。谢谢!!!!!!!

【问题讨论】:

  • 您是否尝试注释掉尝试将组分配给新 ListViewItem 的行?
  • 那行得通...当然,愚蠢的我,我不需要这些组...谢谢!我怎样才能支持你的答案?
  • 我在下面提供了一个答案,您可以接受和/或投票

标签: database vb.net forms listview sqldatareader


【解决方案1】:

这一行

 new_item.Group = frm.ListView1.Groups(Trim(taskData.task_status.ToString))

指的是应该存在于 ListView1 中的组。不需要的可以注释掉

【讨论】:

  • 谢谢,哈哈,你是不是骗了网站?
  • 啊,是的,现在我明白了,不,我只是简单地支持了你的问题,因为它很清楚而且暴露得很好。这个问题读起来有点长,但很容易理解你的推理。结果,您到达了15 reputation mark that allows upvotes。在 SO 中再见 :-)
  • 非常感谢,我已尽我所能使其具有可读性。下次见;)
猜你喜欢
  • 1970-01-01
  • 2016-11-18
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多