【问题标题】:Update from UltraGrid where a condition is true从条件为真的 UltraGrid 更新
【发布时间】:2017-01-16 10:55:54
【问题描述】:

我在一个项目中有一个表单,上面有 2 UltraGrids。一个显示合约信息,另一个包含模块信息。

例如,在合同网格中,可能有 3 行,每行都有一个唯一的合同 ID。单击一行时,它会使用根据该合同分配的模块填充模块网格。

我需要做的是更新数据库中contactID与所选合同行中的ID匹配的模块。

我目前的代码是

For Each ugr As UltraGridRow In ugModules.Rows
   For Each ur As UltraGridRow In ugContracts.Rows

     mID = ugr.Cells("ModuleID").Text
     mName = ugr.Cells("ModuleName").Text
     numUsers = ugr.Cells("NumberUsers").Text

     sql = "UPDATE dbo.tblModules SET ModuleName = ?, NumberUsers = ? WHERE ContractID = ? AND ModuleID = ?"
     cmd = New OleDbCommand(sql, con)
     cmd.Parameters.Add("@mname", OleDbType.VarChar).Value = mName
     cmd.Parameters.Add("@numusers", OleDbType.VarChar).Value = numUsers
     cmd.Parameters.Add("@conID", OleDbType.Integer).Value = ur.Cells("ContractID").Value
     cmd.Parameters.Add("@mid", OleDbType.Integer).Value = mID

       If cmd.ExecuteNonQuery() = 0 Then
          sql = "INSERT INTO dbo.tblModules(ModuleID, ModuleName, NumberUsers, ContractID) VALUES(?, ?, ?, ?)"
          cmd = New OleDbCommand(sql, con)
          cmd.Parameters.Add("@mid", OleDbType.Integer).Value = mID
          cmd.Parameters.Add("@mname", OleDbType.VarChar).Value = mName
          cmd.Parameters.Add("@numusers", OleDbType.VarChar).Value = numUsers
          cmd.Parameters.Add("@conID", OleDbType.Integer).Value = ur.Cells("ContractID").Value

          cmd.ExecuteNonQuery()
       End If
    Next
Next

此代码的问题在于,它试图从与当前客户关联的每个合同中更新每个模块,这会导致 ID 字段发生冲突。

有没有办法修改此代码,使其仅更新具有正在编辑的contractID的记录,而不是显示在联系人表中的所有合同ID?

(抱歉,这有点难以解释,如果是外壳混淆,很高兴澄清任何事情)

【问题讨论】:

    标签: sql vb.net infragistics ultrawingrid


    【解决方案1】:

    如果我正确理解您的问题,那么您应该摆脱外部循环并使用 ActiveRow 属性

    Dim ctrRow = ugContracts.ActiveRow
    if ctrRow IsNot Nothing Then
    
       ' Extract the contractid from the ugContracts active row and use it
       Dim contractID = ctrRow.Cells("ContractID").Value
    
       For Each ugr As UltraGridRow In ugModules.Rows
         mID = ugr .Cells("ModuleID").Text
         mName = ugr .Cells("ModuleName").Text
         numUsers = ugr .Cells("NumberUsers").Text
         sql = "UPDATE dbo.tblModules SET 
                       ModuleName = ?, 
                       NumberUsers = ? 
                WHERE ContractID = ? AND ModuleID = ?"
         cmd = New OleDbCommand(sql, con)
         cmd.Parameters.Add("@mname", OleDbType.VarChar).Value = mName
         cmd.Parameters.Add("@numusers", OleDbType.VarChar).Value = numUsers
         cmd.Parameters.Add("@conID", OleDbType.Integer).Value = contractID
         cmd.Parameters.Add("@mid", OleDbType.Integer).Value = mID
    
         ....
         .... also the insert part can use the contractID variable
         ....
    
       Next
    End If
    

    编辑
    如果您的模块网格包含所有模块并且您使用 UltraGrid 的过滤器功能(代码是 AllowRowFiltering、FilterConditions 等),那么您只能检索当前过滤器中包含的行(因此在网格上可见) 使用这种方法

    For Each ur As UltraGridRow In ugModules.Rows.GetFilteredInNonGroupByRows()
       .....
    Next
    

    【讨论】:

    • 嗨,史蒂夫,我已经检索到 contractID,这不是问题。这是我遇到问题的模块网格,因为它根据选择的联系人(不同的模块到不同的行)过滤它显示的行。因此,如果可能的话,我只需要更新超网格中的可见行吗?
    • 如何过滤模块网格?我想当您选择合同时,模块网格仅填充属于该合同的模块。或者您是否将所有现有模块填充到网格中,然后使用网格的过滤器功能?
    • 第一个,网格中填充了该合约中的模块
    • 我很抱歉,但我不明白这个问题。如果您的 ugModules 网格仅包含单个合约的模块,那么上面显示的代码有什么问题?您从 ugContracts 的 ActiveRow 中获取 contractID,然后每个模块都应使用网格显示的当前数据进行更新。 (也请记住,您可以使用与填充网格的 DataSource 相同的 OleDbDataAdapter 来执行更新)
    • 它在更新中使用旧值,因此新值没有进入数据库
    猜你喜欢
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    相关资源
    最近更新 更多