2017-01-16 3 views
0

У меня есть форма в проекте с 2 UltraGrids на нем. Один показывает информацию о контракте, а другой содержит информацию о модуле.Обновление от UltraGrid, где условие истинно

В сетке контрактов могут быть, например, три строки с уникальным идентификатором контракта. Когда нажимается строка, она заполняет сетку модулей модулями, которые назначаются по этому контракту.

Что мне нужно сделать, это обновление модулей, где contactID в базе данных соответствует идентификатору в выбранной строке контракта.

код у меня до сих пор

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, а не все идентификаторы контракта, которые отображаются в таблице контактов?

(Извиняюсь, это немного трудно объяснить, с удовольствием уточнить что-либо, если это кожух путаницы)

ответ

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 

EDIT
, если ваш модуль сетка содержит все модули и использовать функциональные возможности фильтра в UltraGrid (по коде AllowRowFiltering, FilterConditions и т.д. ...), то вы можете получить только те строки, которые включены в (и таким образом видимым на сетке) с использованием этого метода

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

Привет, Стив, я уже получил контрактный идентификатор, это не проблема. Это сетка модулей, с которой у меня возникла проблема, поскольку она фильтрует, какие строки она отображает, на основе выбранного контакта (разные модули для разных строк). Поэтому мне нужно только обновлять видимые строки в ultragrid, если это возможно? – Harambe

+0

Как вы фильтруете сетку модулей? Я полагаю, что при выборе контракта сетка модуля заполняется только модулями, принадлежащими этому контракту. Или вы заполняете сетку всеми существующими модулями, а затем используете функциональность фильтра сетки? – Steve

+0

Первый, сетка заполнена модулями в этом контракте – Harambe

Смежные вопросы