【问题标题】:VB.net Add new listview item in listview with Checked True?VB.net 在列表视图中添加新的列表视图项目并检查为真?
【发布时间】:2020-02-26 15:19:00
【问题描述】:

如何使用 AddRange 函数设置 Listviewitem 是否检查 True/False?

Try
    _lsv.SuspendLayout()
    _lsv.Items.AddRange((From itm In _desrz.Select(           
                             Function(x) New ListViewItem(New String() {
                                 x.FolderName,
                                 x.FolderPath}
                             ))).ToArray)
Catch ex As Exception
    Throw ex
Finally
    _lsv.ResumeLayout() : _lsv.Update() : _lsv.Refresh()
End Try

_desrz 是一个具有 3 个属性的文件夹对象:FolderPathFolderNameFolderChecked。我可以将FolderPathFolderName 添加到列表视图中,但我无法将检查属性值设置为真/假?

【问题讨论】:

  • 永远不要在Catch 块中使用Throw ex。如果你想重新抛出异常,那么只需使用Throw。也就是说,如果您要做的只是重新抛出异常,那么您有什么 Catch 块呢?如果你有一个 Finally 块,你就不需要一个,所以如果你有一个目的,就只需要一个。
  • 当然可以。您需要重新抛出异常的唯一原因是您首先捕获了它。正如我已经说过的,根本不要抓住它,那么你就不需要重新抛出它。完全摆脱 Catch 块。如果你真的必须包含一个无用的Catch 块,至少要正确地重新抛出并且只使用Throw 而不是Throw ex
  • 补充@jmcilhinney 所说的,Try ... Catch ex ... Throw exTry ... Catch... Throw相同。 Throw ex 将重置堆栈跟踪,因此当捕获到这个新异常时,堆栈跟踪将只回溯到 Throw ex 点。使用Throw 将保留堆栈跟踪。然而,你永远不应该使用Catch .. Throw,除非你之前已经处理了一个明确的异常类型,比如Try ... Catch ex As SpecificExceptionType ... Catch ... Throw。请参阅this answer 了解更多信息。
  • 啊啊啊!!明白了,谢谢我把 throw ex 改成 throw ..apreciate
  • 除非你根本不需要 catch 如果你只是想扔掉它而不做任何其他事情。 ThrowThrow ex 在这里都不是一个好主意。

标签: .net vb.net linq listview windows-forms-designer


【解决方案1】:

您可以使用对象初始化器为新构造的对象设置属性:

New SomeType With {.SomeProperty = someValue, .SomeOtherProperty = someOtherValue}

或者,使用构造函数参数:

New SomeType(someArgument, someOtherArgument) With {.SomeProperty = someValue, .SomeOtherProperty = someOtherValue}

在你的情况下,你的类型是ListViewItem,你的构造函数是String数组,你的属性是Checked

New ListViewItem({x.FolderName, x.FolderPath}) With {.Checked = True}

【讨论】:

    【解决方案2】:

    @jmchinney 回答,这是下面的工作代码,

              Public Shared Async Function LoadFoldersList(_lsv As ListView, _JsonFoldersListPath As String) As Task(Of Boolean)
            Return Await Task.Run(Async Function()
                                      Dim _rslt As Boolean = False
                                      Dim _itmS As ListViewItemCollection = Nothing
                                      Dim _desrz As List(Of TFolder) = Nothing
                                      Dim _lamLsv As Action = Nothing
                                      Try
                                          If My.Computer.FileSystem.FileExists(_JsonFoldersListPath) Then
                                              Dim _cntnts = My.Computer.FileSystem.ReadAllText(_JsonFoldersListPath)
                                              If Not IsNothing(_cntnts) AndAlso Not String.IsNullOrEmpty(_cntnts) Then
                                                  _desrz = Newtonsoft.Json.JsonConvert.DeserializeObject(Of List(Of TFolder))(Await _cntnts.ToDeCryptWOP)
                                                  If Not IsNothing(_desrz) Then
                                                      _lamLsv = Sub()
                                                                    Try
                                                                        _lsv.SuspendLayout()
                                                                        _lsv.Items.AddRange((From itm In _desrz.Select(
                                                                                                     Function(x) New ListViewItem(New String() {
                                                                                                     x.FolderName,
                                                                                                     x.FolderPath}
                                                                                                     ) With {.Checked = x.Checked})).ToArray)
                                                                    Finally
                                                                        _lsv.ResumeLayout() : _lsv.Update() : _lsv.Refresh()
                                                                    End Try
                                                                End Sub
                                                      If _lsv.InvokeRequired Then
                                                          _lsv.Invoke(Sub() _lamLsv())
                                                      Else
                                                          _lamLsv()
                                                      End If
                                                  End If
                                              End If
                                          End If
                                          _rslt = True
                                      Catch ex As Exception
                                          L.Log.WritelogAsync(ex)
                                      Finally
                                          _lamLsv = Nothing : _desrz = Nothing : _itmS = Nothing 'is that correct for prevent memroy leaking
                                      End Try
                                      Return _rslt
                                  End Function)
        End Function
    

    【讨论】:

    • 有一个If _lsv.InvokeRequired Then 后面不跟一个Else 有点奇怪,因为它不会在UI 上调用该方法。从外观上看,该条件将始终为真,因此您可以删除它并始终调用。你仍然有Catch ex As Exception ... Throw。它的用途为零,应该被删除。
    • 感谢您的大力帮助,并为我指出了许多不寻常的代码。我刚刚更新了你的指导方针..如果发生错误如何做 Listview ResumeLayout
    • 好的,现在我明白了。您可以使用Try ... Finally 而不使用Catch。即使Try内部发生异常,它也会在Finally内部运行代码,然后在任何地方被捕获。
    • 感谢您的大力帮助。我在每个函数中使用 finally 块从内存中释放对象是正确的方式吗?
    • @djv,在删除 [_lamLsv = sub() try ... finally] 中的 catch 块后,我无法获取堆栈跟踪,仅获取消息。但是使用 catch block[_lamLsv = sub() try ...Catch ... finally] 我得到了 stacktrace ...有点困惑 ...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 2017-12-18
    相关资源
    最近更新 更多