0

作为序言,我浏览了几篇包含列表视图的帖子,没有什么能与我正在尝试做的事情相比。

我正在尝试通过具有多个 If 语句的循环确定值,类似于以下内容:

If Convert.ToInt32(GetData(ds.Tables("HRIS").Rows(i), "ABS_CO_RULE_DAYS", DefaultValue)) > 0 Or _
           Convert.ToInt32(GetData(ds.Tables("HRIS").Rows(i), "ABS_CO_RULE_HRS", DefaultValue)) > 0 Or _
           Convert.ToInt32(GetData(ds.Tables("HRIS").Rows(i), "ABS_CO_RULE_MINS", DefaultValue)) > 0 Then
       msChargeDays = GetData(ds.Tables("HRIS").Rows(i), "ABS_CO_RULE_DAYS", DefaultValue)
       msChargeHours = GetData(ds.Tables("HRIS").Rows(i), "ABS_CO_RULE_HRS", DefaultValue)
       msChargeMins = GetData(ds.Tables("HRIS").Rows(i), "ABS_CO_RULE_MINS", DefaultValue)
       msHowPaid = "CR DAYS"
       AbsenceLine() 'calls sub
 End If

此代码块从它调用的数据集中返回有效结果。现在在下面的代码块中,我试图吸收由主代码块确定的值,主代码块大约有 40 个 if 语句,其结构与上面的块相似,都包含在 For 循环中。

在下面的代码块中,我试图将 ListViewItem 类型的对象插入到 ListView 中。这是我得到我的错误的地方,它后面的注释字符串表示。填充ListViewItem的函数在底部,所有返回的变量都是类变量,并且返回有效值给ListViewItem。我已经通过调试器仔细检查了这一点。

Private Sub AbsenceLine()

    Dim sTypeReason As String
    If msType = "" Then
        sTypeReason = Left(msReason, 25)
    Else
        sTypeReason = msType & "--" & msReason
    End If

    Dim item As ListViewItem
    item = New ListViewItem(ListViewItemType.DataItem)

    item.DataItem = FillListView(sTypeReason)

    absence_lv.Items.Add(item) 'this line here is what is givine me issues

 End Sub

 Private Function FillListView(typeReason As String) As IEnumerable(Of String)

    Return {msDate, msVoid, msCont, msDays, msHours, msMinutes, typeReason, msChargeDays, msChargeHours,
            msChargeMins, msHowPaid} 'all values returned are of String type
End Function

现在有了背景:

我是否完全偏离了我正在尝试做的事情?
有没有更简单的方法来代替gridview?

4

1 回答 1

0

我认为您在滥用 ListViewItem 类的 DataItem 属性。当 ListView 本身被绑定时,这确实用于获取 ListViewItem 表示的底层对象。

由于您的 FillListView 函数返回一个 IEnumerable(Of String),因此您只需将 ListView 的 DataSource 属性设置为函数调用。

absence_lv.Datasource = FillListView(sTypeReason)
absence_lv.Databind()

如您所见,无需手动添加每个项目。

于 2013-06-25T21:37:11.833 回答