在后台工作人员中更新文本框



在背景工作中无法更新文本框值,要更新的值是在背景工作人员内创建的数据词的列("税收价值"(的总和。没有出现错误消息

按钮单击以下事件升高

Private Sub btnCalcTax_Click(sender As Object, e As EventArgs) Handles btnCalcTax.Click        
        BackgroundWorker1.RunWorkerAsync()
    End Sub

我创建了一个计算税的功能。

Public Sub TAXCALC(itemname As String, rackrate As Double, discountedrate As Double, billdate As Date)
    Dim finalfdtaxcalcdt As New DataTable
    finalfdtaxcalcdt.Columns.Clear()
    finalfdtaxcalcdt.Rows.Clear()
    Dim outlettyp As String = "POS"
    Dim taxcount As New DataTable
    Dim tax As New DataTable
    If finalfdtaxcalcdt.Columns.Count = 0 Then
        finalfdtaxcalcdt.Columns.Add("TaxID")
        finalfdtaxcalcdt.Columns.Add("TaxName")
        finalfdtaxcalcdt.Columns.Add("TaxableValue")
        finalfdtaxcalcdt.Columns.Add("TaxRate")
        finalfdtaxcalcdt.Columns.Add("SalesAmount")
        finalfdtaxcalcdt.Columns.Add("TaxAmount")
        finalfdtaxcalcdt.Columns.Add("SalesID")
        finalfdtaxcalcdt.Columns.Add("PurchaseID")
        finalfdtaxcalcdt.Columns.Add("TaxClassID")
    End If
    For i = 0 To BodyGridView.RowCount - 1
        If IsDBNull(BodyGridView.GetRowCellValue(i, "Particulars")) Then
            Exit Sub
        End If
        If BodyGridView.GetRowCellValue(i, "Particulars") <> "# End of List" Then
            Dim tempdt As New DataTable
            If isinterstate Then
                GetDataSetFromSqlToDataTable("Select * from MstTax where TaxClassId = (Select Distinct(TaxClassid) from mstitemTaxClass where ApplyFrom = (SELECT MAX(ApplyFrom) FROM dbo.MstItemTaxClass WHERE ApplyFrom <= '" + billdate.ToString("yyyy-MM-dd") + "' and ItemId = '" + GetDataFromSql("Select ITEM_ID from MStItem where Item = '" + BodyGridView.GetRowCellValue(i, "Particulars") + "'", con) + "')) and IsInterState = 'TRUE'", tempdt)
                'GetDataSetFromSqlToDataTable("Select * from MstTax where TaxClassId = (Select TaxClass_Id from MstItem where Item = '" + BodyGridView.GetRowCellValue(i, "Particulars").ToString + "') and IsInterState = 'True'", tempdt)
            Else
                GetDataSetFromSqlToDataTable("Select * from MstTax where TaxClassId = (Select Distinct(TaxClassid) from mstitemTaxClass where ApplyFrom = (SELECT MAX(ApplyFrom) FROM dbo.MstItemTaxClass WHERE ApplyFrom <= '" + billdate.ToString("yyyy-MM-dd") + "' and ItemId = '" + GetDataFromSql("Select ITEM_ID from MStItem where Item = '" + BodyGridView.GetRowCellValue(i, "Particulars") + "'", con) + "')) and IsInterState = 'False'", tempdt)
                'GetDataSetFromSqlToDataTable("Select * from MstTax where TaxClassId = (Select TaxClass_Id from MstItem where Item = '" + BodyGridView.GetRowCellValue(i, "Particulars").ToString + "') and IsInterState = 'False'", tempdt)
            End If
            Dim sum As Double = tempdt.Compute("SUM(TaxRate)", String.Empty)
            For j = 0 To tempdt.Rows.Count - 1
                If finalfdtaxcalcdt.Select("TaxID = '" + tempdt.Rows(j).Item(0).ToString + "'").Count = 0 Then
                    finalfdtaxcalcdt.Rows.Add()
                    finalfdtaxcalcdt.Rows(finalfdtaxcalcdt.Rows.Count - 1).Item("TaxID") = tempdt.Rows(j).Item("Tax_ID").ToString
                    finalfdtaxcalcdt.Rows(finalfdtaxcalcdt.Rows.Count - 1).Item("TaxName") = tempdt.Rows(j).Item("TaxName").ToString
                    finalfdtaxcalcdt.Rows(finalfdtaxcalcdt.Rows.Count - 1).Item("TaxRate") = tempdt.Rows(j).Item("TaxRate").ToString
                    finalfdtaxcalcdt.Rows(finalfdtaxcalcdt.Rows.Count - 1).Item("SalesAmount") = Double.Parse(BodyGridView.GetRowCellValue(i, "Amount"))
                    finalfdtaxcalcdt.Rows(finalfdtaxcalcdt.Rows.Count - 1).Item("TaxAmount") = Math.Round((Double.Parse(finalfdtaxcalcdt.Rows(finalfdtaxcalcdt.Rows.Count - 1).Item("SalesAmount")) / (1 + (Double.Parse(sum) * 0.01))) * (Double.Parse(finalfdtaxcalcdt.Rows(finalfdtaxcalcdt.Rows.Count - 1).Item("TaxRate")) * 0.01), 2)
                    finalfdtaxcalcdt.Rows(finalfdtaxcalcdt.Rows.Count - 1).Item("TaxableValue") = Math.Round(Double.Parse(finalfdtaxcalcdt.Rows(finalfdtaxcalcdt.Rows.Count - 1).Item("SalesAmount")) / (1 + (sum * 0.01)), 2)
                    finalfdtaxcalcdt.Rows(finalfdtaxcalcdt.Rows.Count - 1).Item("SalesID") = tempdt.Rows(j).Item("SalesAc_ID").ToString
                    finalfdtaxcalcdt.Rows(finalfdtaxcalcdt.Rows.Count - 1).Item("TaxClassID") = tempdt.Rows(j).Item("TaxClassId").ToString
                    'finalfdtaxcalcdt.Rows(finalfdtaxcalcdt.Rows.Count - 1).Item("PurchaseID") = tempdt.Rows(j).Item("TaxRate").ToString
                Else
                    Dim index As Integer = finalfdtaxcalcdt.Rows.IndexOf(finalfdtaxcalcdt.Select("TaxId = '" + tempdt.Rows(j).Item(0).ToString + "'").FirstOrDefault())
                    finalfdtaxcalcdt.Rows(index).Item("SalesAmount") = Double.Parse(finalfdtaxcalcdt.Rows(index).Item("SalesAmount")) + Double.Parse(BodyGridView.GetRowCellValue(i, "Amount"))
                    finalfdtaxcalcdt.Rows(index).Item("TaxAmount") = Math.Round((Double.Parse(finalfdtaxcalcdt.Rows(index).Item("SalesAmount")) / (1 + (Double.Parse(sum) * 0.01))) * (Double.Parse(finalfdtaxcalcdt.Rows(index).Item("TaxRate")) * 0.01), 2)
                    finalfdtaxcalcdt.Rows(index).Item("TaxableValue") = Math.Round(Double.Parse(finalfdtaxcalcdt.Rows(index).Item("SalesAmount")) / (1 + (sum * 0.01)), 2)
                End If
            Next
        End If
    Next
    '        MsgBox(finalfdtaxcalcdt.Compute("Sum(TaxAmount)", String.Empty).ToString + "1")
    '        TaxGridControl.DataSource = finalfdtaxcalcdt
    ''       TaxGridView.Columns("TaxID").Visible = False
    '     TaxGridView.Columns("SalesAmount").Visible = False
    '    TaxGridView.Columns("SalesID").Visible = False
    '   TaxGridView.Columns("PurchaseID").Visible = False
    '  TaxGridView.Columns("TaxClassID").Visible = False
    Dim k As String = finalfdtaxcalcdt.Compute("Sum(TaxAmount)", String.Empty)
    TextBox1.Invoke(DirectCast(Sub() TextBox1.Text = k.ToString, MethodInvoker))
End Sub

我无法将列(" axableValue"(的总和更新为textbox1.text

背景工具的代码是

    Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
            TAXCALC()
 End Sub

您需要使用委托。

msdn Control.invoke方法(委托(

示例:

Public Delegate Sub _TAXCALC(itemname As String, rackrate As Double, discountedrate As Double, billdate As Date)
Public Sub TAXCALC(itemname As String, rackrate As Double, discountedrate As Double, billdate As Date)
    If BodyGridView.InvokeRequired Then
        BodyGridView.Invoke(New _TAXCALC(AddressOf TAXCALC), itemname, rackrate, discountedrate, billdate)
    Else
        'Your code here'
    End If
End Sub

希望会有所帮助。

,除非我缺少某些内容,否则您应该从casscalc方法返回该值(显然首先转换为函数(,将E. re. recresult in Do Work方法设置为runworkercomplet。

如有疑问,请阅读msdn

如果您的操作产生结果,则可以将结果分配给Doworkeventargs.srult属性。这将可用于RunworkerCompletedEventargs.result属性的RunWorkerCompleted事件处理程序。

您无法在背景工作线程的上下文中访问形式对象,因为两个对象都在不同的线程的上下文中运行(即使它们可能在同一过程的上下文中运行(。<<<<<<<<<<<<

背景工作人员的数据需要在您的班级内进行缓冲。获取此数据并将其传递给控件的例程必须在创建表单的过程的上下文中运行。

快速而简单的方法是创建

  • 一个缓冲区变量包含来自背景工作的结果数据
  • 一个布尔变量,指示可以获取数据(可以在runworkercompleted事件上设置(
  • 您表格(例如计时器(上的更新例程以检查指示变量并根据需要更新控件
  • 获取缓冲数据,重置指示器和清除缓冲区的常规习惯

注意:应将更新例程保持尽可能简短,因为它将同步运行并因此阻止表单。有关更复杂的控制更新,请考虑对beginupdate,sustendlayout,requmelayout,endupdate和common Windows.form.s.control更新行为进行研究。

在调用(update(

之前添加此代码
 Control.CheckForIllegalCrossThreadCalls = False

希望对您有帮助。

最新更新