从条件为真的UltraGrid更新

时间:2017-01-16 10:55:55

标签: sql vb.net infragistics ultragrid

我在项目中有一个表单,其上有UltraGridsFor 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 。一个显示合同信息,另一个包含模块信息。

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

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

到目前为止我的代码是

data-slide

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

是否有办法修改此代码,以便它只更新具有正在编辑的contractID的记录,而不是更新联系人表中显示的所有合同ID?

(道歉,这有点难以解释,很高兴澄清任何事情,如果它是套管混乱)

1 个答案:

答案 0 :(得分: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