无法启用约束,因为并非所有值都有父值

问题描述 投票:0回答:1

我在代码中创建了一个 devexpress 网格,列定义如下 我收到错误(见下文) 抱歉,如果代码片段有点长,想展示我是如何完成任务的!

              'Expense details
        FrmExpenses.GrdExpensesDetails.Columns.Add(New DevExpress.XtraGrid.Columns.GridColumn() With {
        .Caption = "PurchasedAtID",
        .FieldName = "PurchasedAtID",
        .Width = 0,
        .UnboundDataType = GetType(String),
        .Visible = False})

        FrmExpenses.GrdExpensesDetails.Columns.Add(New DevExpress.XtraGrid.Columns.GridColumn() With {
       .Caption = "Purchased At",
        .FieldName = "TName",
       .Width = 450,
       .UnboundDataType = GetType(String),
       .Visible = True})

        'Expense items
        FrmExpenses.GrdExpensesItems.Columns.Add(New DevExpress.XtraGrid.Columns.GridColumn() With {
        .Caption = "PurchasedAtID",
        .FieldName = "PurchasedAtID",
        .Width = 0,
        .UnboundDataType = GetType(String),
        .Visible = False})

        FrmExpenses.GrdExpensesItems.Columns.Add(New DevExpress.XtraGrid.Columns.GridColumn() With {
        .Caption = "ExpID",
        .FieldName = "ExpID",
        .Width = 0,
        .UnboundDataType = GetType(String),
        .Visible = False})

        FrmExpenses.GrdExpensesItems.Columns.Add(New DevExpress.XtraGrid.Columns.GridColumn() With {
       .Caption = "Date",
        .FieldName = "InvDte",
       .Width = 100,
       .UnboundDataType = GetType(String),
       .Visible = True})

        FrmExpenses.GrdExpensesItems.Columns.Add(New DevExpress.XtraGrid.Columns.GridColumn() With {
       .Caption = "InvNo",
       .FieldName = "InvNo",
       .Width = 100,
       .UnboundDataType = GetType(String),
       .Visible = True})

        FrmExpenses.GrdExpensesItems.Columns.Add(New DevExpress.XtraGrid.Columns.GridColumn() With {
       .Caption = "Amount",
       .FieldName = "InvAmt",
       .Width = 100,
       .UnboundDataType = GetType(String),
       .Visible = True})

        FrmExpenses.GrdExpensesItems.Columns.Add(New DevExpress.XtraGrid.Columns.GridColumn() With {
       .Caption = "%",
       .FieldName = "PrjPercentage",
       .Width = 100,
       .UnboundDataType = GetType(String),
       .Visible = True})

现在我定义了“购买地点”声明

  Private Function GetExpensesInvoicesDataTable() As DataTable

  Dim table As New DataTable With {
              .TableName = "ExpensesInvoices"
          }

  Try

      table.Columns.Add("PurchasedAtID", GetType(String)).Caption = "PurchasedAtID"
      With FrmExpenses.GrdExpensesDetails.Columns(0)
          .OptionsColumn.AllowFocus = False
          .OptionsColumn.AllowEdit = False
          .OptionsColumn.FixedWidth = True
          .AppearanceHeader.TextOptions.HAlignment = HorzAlignment.Center
      End With

      table.Columns.Add("TName", GetType(String)).Caption = "TName"
      With FrmExpenses.GrdExpensesDetails.Columns(1)
          .OptionsColumn.AllowFocus = True
          .OptionsColumn.AllowEdit = False
          .OptionsColumn.FixedWidth = False
          .AppearanceHeader.TextOptions.HAlignment = HorzAlignment.Default
      End With

      'Do not show Mileage or Vehicle Expenses
      Dim strV As String = "3165054"
      Dim strM As String = "3612231422"

      'show current year data
      Dim strID As String = "2023" 'Format(Now, "yyyy")

      Dim rea As OleDbDataReader

      con.Open()

      'Load
      Dim cmd As New OleDb.OleDbCommand("SELECT DISTINCT tblExpenses.PurchasedAtID, tblTradesVendors.TName FROM tblExpenses INNER JOIN tblTradesVendors ON tblExpenses.PurchasedAtID = tblTradesVendors.TradeID WHERE tblExpenses.Yr '" & strID & "' ORDER BY tblTradesVendors.TName", con)

      rea = cmd.ExecuteReader

      If rea.HasRows Then
          While rea.Read()

              table.Rows.Add(rea("PurchasedAtID"), rea("TName"))

          End While
      End If

      con.Close()

      Return table

  Catch ex As Exception

      con.Close()

      Return table

      XtraMessageBox.Show(ex.Message, Application.ProductName & " - GetExpensesInvoicesDataTable Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
      Err.Clear()

  End Try

  Return table

 End Function

现在我们找到发票的详细信息

Private Function GetExpensesInvoicesRowsDataTable() As DataTable

    Dim table As New DataTable With {
            .TableName = "ExpensesInvoicesRows"
        }

    Try

        'show current year data
        'Dim strID As String = "2023"

        table.Columns.Add("PurchasedAtID", GetType(String)).Caption = "PurchasedAtID"
        With FrmExpenses.GrdExpensesItems.Columns(0)
            .OptionsColumn.AllowFocus = False
            .OptionsColumn.AllowEdit = False
            .OptionsColumn.FixedWidth = False
            .AppearanceHeader.TextOptions.HAlignment = HorzAlignment.Center
        End With

        table.Columns.Add("ExpID", GetType(String)).Caption = "ExpID"
        With FrmExpenses.GrdExpensesItems.Columns(1)
            .OptionsColumn.AllowFocus = False
            .OptionsColumn.AllowEdit = False
            .AppearanceHeader.TextOptions.HAlignment = HorzAlignment.Center
        End With

        table.Columns.Add("InvDte", GetType(String)).Caption = "InvDte"
        With FrmExpenses.GrdExpensesItems.Columns(2)
            .OptionsColumn.AllowFocus = True
            .OptionsColumn.AllowEdit = False
            .AppearanceHeader.TextOptions.HAlignment = HorzAlignment.Far
        End With

        table.Columns.Add("InvNo", GetType(String)).Caption = "InvNo"
        With FrmExpenses.GrdExpensesItems.Columns(3)
            .OptionsColumn.AllowFocus = False
            .OptionsColumn.AllowEdit = False
            .AppearanceHeader.TextOptions.HAlignment = HorzAlignment.Default
        End With

        table.Columns.Add("InvAmt", GetType(String)).Caption = "InvAmt"
        With FrmExpenses.GrdExpensesItems.Columns(4)
            .OptionsColumn.AllowFocus = True
            .OptionsColumn.AllowEdit = False
            .AppearanceHeader.TextOptions.HAlignment = HorzAlignment.Far
        End With

        table.Columns.Add("PrjPercentage", GetType(String)).Caption = "PrjPercentage"
        With FrmExpenses.GrdExpensesItems.Columns(5)
            .OptionsColumn.AllowFocus = False
            .OptionsColumn.AllowEdit = False
            .AppearanceHeader.TextOptions.HAlignment = HorzAlignment.Default
        End With

        Dim rea As OleDbDataReader

        con.Open()

        'Load
        Dim cmd As New OleDb.OleDbCommand("SELECT tblExpenses.PurchasedAtID, tblExpenses.ExpID, tblExpenses.InvDte, tblExpenses.InvNo, tblExpenses.InvAmt, tblExpInvItems.PrjPercentage FROM tblExpenses INNER JOIN tblExpInvItems ON tblExpenses.ExpID = tblExpInvItems.ExpID ORDER BY tblExpenses.InvDte DESC", con) 'WHERE tblExpenses.Yr ='" & strID & "'

        rea = cmd.ExecuteReader

        'Add to the Combo box
        If rea.HasRows Then
            While rea.Read()

                table.Rows.Add(rea("PurchasedAtID"), rea("ExpID"), rea("InvDte"), rea("InvNo"), rea("InvAmt"), rea("PrjPercentage"))

            End While
        End If

        con.Close()

        Return table

    Catch ex As Exception

        con.Close()

        Return table

        XtraMessageBox.Show(ex.Message, Application.ProductName & " - GetExpensesInvoicesRowsDataTable Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Err.Clear()

    End Try

    Return table
End Function

现在加载网格

  Public Sub BindExpensesGrid()

Try

        _DataSet = New DataSet()

        _DataSet.Tables.Add(GetExpensesInvoicesDataTable())
        _DataSet.Tables.Add(GetExpensesInvoicesRowsDataTable())

        Dim keyColumn As DataColumn = _DataSet.Tables("ExpensesInvoices").Columns("PurchasedAtID")
        Dim foreignKeyColumn As DataColumn = _DataSet.Tables("ExpensesInvoicesRows").Columns("PurchasedAtID")

        _DataSet.Relations.Add("Level1", keyColumn, foreignKeyColumn)
        FrmExpenses.GrdExpenses.DataSource = _DataSet.Tables("ExpensesInvoices")

        FrmExpenses.GrdExpenses.ForceInitialize()

    Catch ex As Exception

        con.Close()

        XtraMessageBox.Show(ex.Message, Application.ProductName & " - BindExpensesGrid Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Err.Clear()

    Finally

        FrmExpenses.GrdExpenses.EndUpdate()

    End Try

End Sub

我收到以下错误

我看不出原因? 有人能指出这个问题吗??? 预先感谢

vb.net devexpress-gridcontrol
1个回答
0
投票

你可能是对的,我的朋友,仍在学习 DevExpress。 但是,暂时如果我使用与 Devcomponents 相同的代码,它可以工作???

 'Dim strID As String = "2023"
 _DataSet = New DataSet()
 FrmExpenses.GrdExpenses.BeginUpdate()
 con.Open()

 Dim adapter As New OleDbDataAdapter("SELECT DISTINCT 
 tblExpenses.PurchasedAtID, tblTradesVendors.TName FROM (tblExpenses INNER 
 JOIN tblExpInvItems ON tblExpenses.ExpID = tblExpInvItems.ExpID) INNER 
JOIN tblTradesVendors ON tblExpenses.PurchasedAtID = 
tblTradesVendors.TradeID WHERE tblExpInvItems.Yr ='" & strID & "'  ORDER BY 
tblTradesVendors.TName", con)

adapter.Fill(_DataSet, "ExpensesInvoices")

CType(New OleDbDataAdapter("SELECT tblExpenses.PurchasedAtID, tblExpenses.ExpID, tblExpenses.InvDte, tblExpenses.InvNo, tblExpenses.InvAmt, tblExpInvItems.PrjPercentage FROM tblExpenses INNER JOIN tblExpInvItems ON tblExpenses.ExpID = tblExpInvItems.ExpID ORDER BY tblExpenses.InvDte DESC", con), OleDbDataAdapter).Fill(_DataSet, "ExpensesInvoicesRows")

_DataSet.Relations.Add("Level1", 
_DataSet.Tables("ExpensesInvoices").Columns("PurchasedAtID"), 
_DataSet.Tables("ExpensesInvoicesRows").Columns("PurchasedAtID"), False)

 With FrmExpenses.GrdExpenses
.DataSource = _DataSet
.DataMember = "ExpensesInvoices"

.ForceInitialize()
 End With
 con.Close()
© www.soinside.com 2019 - 2024. All rights reserved.