我在项目中有一个表单,其上有UltraGrids
个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
。一个显示合同信息,另一个包含模块信息。
在合同网格中,可能有3行,例如,每行都有唯一的合同ID。单击一行时,它会使用在该合同下分配的模块填充模块网格。
我需要做的是更新数据库中contactID所在的模块,与所选合同行中的ID匹配。
到目前为止我的代码是
data-slide
此代码的问题在于,它尝试更新与当前客户关联的每个合同中的每个模块,这会导致ID字段中的冲突。
是否有办法修改此代码,以便它只更新具有正在编辑的contractID的记录,而不是更新联系人表中显示的所有合同ID?
(道歉,这有点难以解释,很高兴澄清任何事情,如果它是套管混乱)
答案 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