2017-01-16 11 views
0

我在一个项目中有一个窗体,其上有2 UltraGrids。一个显示合同信息,另一个包含模块信息。条件为真的UltraGrid更新

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

我需要做的是更新数据库中联系人ID与选定合同行中的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?

(道歉,这是一个有点难以解释,高兴,如果它的外壳混乱,以澄清任何东西)

回答

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等...),那么你可以只检索所包含的行在th e当前过滤器(并因此在网格上可见)使用此方法

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

您好Steve,我已经检索contractID,这不是问题。这是我遇到问题的模块网格,因为它会根据所选联系人(不同模块到不同行)过滤显示哪些行。因此,如果可能的话,我只需要更新ultragrid中的可见行。 – Harambe

+0

如何过滤模块网格?我想,当你选择合同时,模块网格仅填充属于该合同的模块。或者你填充网格将所有存在的模块,然后使用网格的过滤器功能? – Steve

+0

第一个,网格填写合同中的模块 – Harambe