Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.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 不允许在Lambda表达式中使用ByRef参数。解决方法没有为参数提供正确的状态_Vb.net_Lambda_Persistence_Pass By Reference_Byref - Fatal编程技术网

Vb.net 不允许在Lambda表达式中使用ByRef参数。解决方法没有为参数提供正确的状态

Vb.net 不允许在Lambda表达式中使用ByRef参数。解决方法没有为参数提供正确的状态,vb.net,lambda,persistence,pass-by-reference,byref,Vb.net,Lambda,Persistence,Pass By Reference,Byref,查看哪些引用,似乎无法将发送到调用子int的参数传递给Lambda表达式,因为它是ByRef参数 我创建了一个临时参数(实际上有两个-Lambda表达式中需要两个),并将其传递到长时间运行的任务中 这项任务执行得很好。它使用一个Parallel.ForEach表达式,该表达式以原始时间的30%运行 问题是在这个调用下面需要这两个ByRef参数 Parallel.ForEach将数百个值插入Excel。下面的语句应进行格式化,并使每个单元格都可以单击以打开包含其他信息的对话框窗口。格式化和可单击性

查看哪些引用,似乎无法将发送到调用子int的参数传递给Lambda表达式,因为它是ByRef参数

我创建了一个临时参数(实际上有两个-Lambda表达式中需要两个),并将其传递到长时间运行的任务中

这项任务执行得很好。它使用一个
Parallel.ForEach
表达式,该表达式以原始时间的30%运行

问题是在这个调用下面需要这两个ByRef参数

Parallel.ForEach
将数百个值插入Excel。下面的语句应进行格式化,并使每个单元格都可以单击以打开包含其他信息的对话框窗口。格式化和可单击性都不起作用

下面是调用子签名、Lambda表达式和一些随后被调用的代码:

    Friend Sub RefreshFormattingSummaryReport(ByRef oDPWorksheet As CDPWorksheet, ByRef oSheet As Microsoft.Office.Interop.Excel.Worksheet,
                                          ByRef worker As BackgroundWorker)



    Dim tempDPWorksheet As New CDPWorksheet
    tempDPWorksheet = oDPWorksheet
    Dim tempOsheet As New Microsoft.Office.Interop.Excel.Worksheet
    tempOsheet = oSheet


                Parallel.ForEach(rangeList,
                Sub(singleTuple)
                    Dim iRow1 As Integer = 0
                    Dim iRow2 As Integer = 0
                    Dim iMaxRow As Integer = 0
                    Dim iCol1 As Integer = 0
                    Dim iCol2 As Integer = 0
                    Dim oRange As Range
                    Dim oRange2 As Range
                    Dim oCellValues() As String = Nothing
                    Dim oDesignSheet As Microsoft.Office.Interop.Excel.Worksheet
                    Dim bLoadFormulas As Boolean = False

                    Dim NamedRange = singleTuple.NamedRange
                    Dim NamedRangeRow = singleTuple.NamedRangeRow
                    Dim NamedRangeColumn = singleTuple.NamedRangeColumn
                    Dim NamedRangeCellValue = singleTuple.NamedRangeCellValue

                    If InStr(NamedRange, tempDPWorksheet.SheetID) > 0 Then

                        iRow1 = Integer.Parse(NamedRangeRow.ToString.Substring(0, IIf(InStr(NamedRangeRow, "-") > 0, InStr(NamedRangeRow, "-") - 1, Len(NamedRangeRow))))
                        iRow2 = Integer.Parse(NamedRangeRow.ToString.Substring(IIf(InStr(NamedRangeRow, "-") > 0, InStr(NamedRangeRow, "-"), 0), IIf(InStr(NamedRangeRow, "-") > 0, Len(NamedRangeRow) - InStr(NamedRangeRow, "-"), Len(NamedRangeRow))))
                        If iRow2 > iMaxRow Then iMaxRow = iRow2

                        If InStr(NamedRangeColumn, "DP_COL") > 0 Then
                            oRange = tempOsheet.Range(NamedRangeColumn)
                            iCol1 = oRange.Column
                            iCol2 = iCol1
                            oRange = Nothing
                        Else
                            iCol1 = Integer.Parse(NamedRangeColumn.ToString.Substring(0, IIf(InStr(NamedRangeColumn, "-") > 0, InStr(NamedRangeColumn, "-") - 1, Len(NamedRangeColumn))))
                            iCol2 = Integer.Parse(NamedRangeColumn.ToString.Substring(IIf(InStr(NamedRangeColumn, "-") > 0, InStr(NamedRangeColumn, "-"), 0), IIf(InStr(NamedRangeColumn, "-") > 0, Len(NamedRangeColumn) - InStr(NamedRangeColumn, "-"), Len(NamedRangeColumn))))
                        End If

                        oRange = CType(tempOsheet.Range(tempOsheet.Cells(iRow1, iCol1), tempOsheet.Cells(iRow2, iCol2)), Microsoft.Office.Interop.Excel.Range)
                        oCellValues = Split(Replace(Replace(Replace(Replace(Replace(Replace(NamedRangeCellValue, "{", ""), "}", ""), "&amp;", "&"), "amp;", ""), "&lt;", "<"), "&gt;", ">"), ",| ")

                        If oRange IsNot Nothing Then
                            If oCellValues.Length = oRange.Rows.Count Then

                                For j = 1 To oRange.Rows.Count

                                    Try
                                        oRange2 = oRange.Cells.Item(j)
                                        If oCellValues(j - 1).Length >= 2 Then
                                            oRange2.Value = IIf(oCellValues(j - 1).Substring(0, 2).Equals("  "), oCellValues(j - 1), LTrim(oCellValues(j - 1)))
                                        Else
                                            oRange2.Value = oCellValues(j - 1)
                                        End If
                                    Catch ex As Exception
                                        'MessageBox.Show(String.Format("Error: {0}", ex.Message, oRange.Cells.Item(j)))
                                    End Try

                                Next

                            End If
                        End If

                        tempOsheet.Names.Add(Replace(NamedRange, tempDPWorksheet.SheetID & ".", "").Replace(" ", "_").Replace("-", "_").Replace(",", ""), oRange)

                        Try


                            If tempDPWorksheet.Columns.Contains(NamedRangeColumn) Then
                                bLoadFormulas = (tempDPWorksheet.Columns.IndexOf(NamedRangeColumn) <> -1) AndAlso (DirectCast(tempDPWorksheet.Columns(tempDPWorksheet.Columns.IndexOf(NamedRangeColumn)), CColumn).Type = EColumnTypes.Excel) Or NameIsExcelRow(NamedRange.ToString)
                            Else
                                bLoadFormulas = False
                            End If

                            If Not (InStr(NamedRange, "DP_FRO") > 0 Or InStr(NamedRange, "DRILLPOINT") > 0) Then
                                ' ************** Repetitive Copy/Paste operations
                                RangeCopyDesignFormat(oRange, oDesignSheet.Range(Replace(NamedRange, tempDPWorksheet.SheetID & ".", "")), False, Not tempDPWorksheet.IncludeFormatting Or Not (Not (InStr(NamedRange, "SKIP") > 0) Or tempDPWorksheet.FormatSkipped), False, "", bLoadformulas:=bLoadFormulas, bLoadComments:=True)
                            End If

                        Catch ex As Exception

                        End Try

                    End If
                End Sub)
    oSheet = tempOsheet
    oDPWorksheet = tempDPWorksheet

    ReplaceKeywordsInHeaderAndFooter("", oDBInfo, oSheet, "", "", oProp.Value)

    If oDPWorksheet.IncludeDrilldown Then
        DrillDownLoad(oSheet, oDPWorksheet, oSmartTags, oDBInfo, "", 4 + iRowOffset)
    End If

    SuppressRows(oSheet, oDPWorksheet, oDBInfo, iMaxRow, iRowOffset:=iRowOffset)

    If Not oDPWorksheet.DoNotAutofitColumns Then
        tWidth = oSheet.Range("DP_FRO_" & oDPWorksheet.FROutlineID).ColumnWidth
        oSheet.Range("DRILLPOINT").Columns.AutoFit()
        oSheet.Range("DP_FRO_" & oDPWorksheet.FROutlineID).ColumnWidth = tWidth
    End If
    HideColumns(oSheet, oDPWorksheet.Columns, "DP_FRO_" & oDPWorksheet.FROutlineID, oDPWorksheet.HideFROColumn)
我已经尝试将临时变量分配回ByRef参数,并且还尝试使用临时名称更改Sub其余部分中ByRef参数的每个实例。两者都不起作用


有什么想法吗?非常感谢您的建议。

哪些参数是ByRef?为什么它们是ByRef?你能显示方法签名吗?@ChrisDunaway-代码中添加了签名。工作表和工作表对象被传递给其他几个子系统,您似乎没有将新工作表重新分配给
oDPWorksheet
oSheet
,我无法想象您会将新的后台工作表重新分配给
worker
变量的场景。看起来这些变量根本不需要通过ByRef传递。也许这太过分了。这是~2005年的遗留代码。我将通过删除子调用中的所有ByRef来测试它。谢谢。删除了ByRef。好消息是,什么也没发生。糟糕的是,什么也没发生。仍然无法获得格式化或可单击性。我可能会重新评估并用不同的问题陈述提出问题。哪些参数是
ByRef
?为什么它们是ByRef?你能显示方法签名吗?@ChrisDunaway-代码中添加了签名。工作表和工作表对象被传递给其他几个子系统,您似乎没有将新工作表重新分配给
oDPWorksheet
oSheet
,我无法想象您会将新的后台工作表重新分配给
worker
变量的场景。看起来这些变量根本不需要通过ByRef传递。也许这太过分了。这是~2005年的遗留代码。我将通过删除子调用中的所有ByRef来测试它。谢谢。删除了ByRef。好消息是,什么也没发生。糟糕的是,什么也没发生。仍然无法获得格式化或可单击性。我可能会重新评估,并用不同的问题陈述提出问题。