DROPDOWNLIST COM MULTIPLA SELE?ÃO

SOMEBODY 27/10/2017 08:30:19
#477442
Tenho uma tabela defeitos e uma de processos, sendo que um defeito pode ter um ou vários processos. Por enquanto tenho a funcionar uma dropdownlist para um defeito, um processo, que alterações preciso fazer para poder seleccionar varios processos, Estou a usar vb.net

segue o codigo abaixo:
  [ô] GET: DEF_DEFECT/Create
Function Create() As ActionResult
PopProcessDropDownList()
Return View()
End Function

[ô] POST: DEF_DEFECT/Create
[ô]To protect from overposting attacks, please enable the specific properties you want to bind to, for
[ô]more details see http://go.microsoft.com/fwlink/?LinkId=317598.
<HttpPost()>
<ValidateAntiForgeryToken()>
Function Create(<Bind(Include:=[Ô]CODE_DEF,DESCRIPTION_DEF[Ô])> ByVal dEF_DEFECT As DEF_DEFECT) As ActionResult
If ModelState.IsValid Then
db.DEF_DEFECT.Add(dEF_DEFECT)

Dim processSelected As String = Request.Form([Ô]ProcessesList[Ô]).ToString()

UpdateDefectProcess(dEF_DEFECT, processSelected)

db.SaveChanges()
Return RedirectToAction([Ô]Index[Ô])

End If
Return View(dEF_DEFECT)
End Function

[ô] GET: DEF_DEFECT/Edit/5
Function Edit(ByVal id As String) As ActionResult
If IsNothing(id) Then
Return New HttpStatusCodeResult(HttpStatusCode.BadRequest)
End If

Dim dEF_DEFECT As DEF_DEFECT = db.DEF_DEFECT.Find(id)
If IsNothing(dEF_DEFECT) Then
Return HttpNotFound()
End If

PopulateProcessesDropDownList(dEF_DEFECT.PRO_PROCESS)

Return View(dEF_DEFECT)
End Function

Sub PopProcessDropDownList()
Dim listSelectListItems As List(Of SelectListItem) = New List(Of SelectListItem)

For Each p As PRO_PROCESS In db.PRO_PROCESS
Dim selectItem As SelectListItem = New SelectListItem()
selectItem.Text = p.CODE_PRO
listSelectListItems.Add(selectItem)
Next

ViewBag.ProcessCode = listSelectListItems
End Sub


Sub PopulateProcessesDropDownList(selectedprocesses As Object)
[ô] Dropdown Lists
Dim allProcesses = From s In db.PRO_PROCESS
Order By s.CODE_PRO
Select s.CODE_PRO, s.DESCRIPTION_PRO Distinct

ViewBag.PList = New SelectList(allProcesses, [Ô]CODE_PRO[Ô], [Ô]CODE_PRO[Ô], selectedValue:=selectedprocesses)
End Sub

[ô] POST: DEF_DEFECT/Edit/5
[ô]To protect from overposting attacks, please enable the specific properties you want to bind to, for
[ô]more details see http://go.microsoft.com/fwlink/?LinkId=317598.
<HttpPost()>
<ValidateAntiForgeryToken()>
Function Edit(<Bind(Include:=[Ô]CODE_DEF,DESCRIPTION_DEF[Ô])> ByVal dEF_DEFECT As DEF_DEFECT) As ActionResult
If ModelState.IsValid Then
Dim processToUpdate = db.DEF_DEFECT _
.Include(Function(i) i.PRO_PROCESS) _
.Where(Function(i) i.CODE_DEF = dEF_DEFECT.CODE_DEF) _
.Single()

Dim processSelected As String = Request.Form([Ô]ProcessesList[Ô]).ToString()

UpdateDefectProcess(processToUpdate, processSelected)

db.Entry(processToUpdate).State = EntityState.Modified

db.SaveChanges()
Return RedirectToAction([Ô]Index[Ô])
End If
Return View(dEF_DEFECT)
End Function

Private Sub UpdateDefectProcess(updateDefect As DEF_DEFECT, processSelected As String)
[ô]Dim selectedProcessHS = New HashSet(Of String)(processSelected)
Dim selectedProcessHS = processSelected

Dim defectProcess As IEnumerable(Of String) = New HashSet(Of String)(updateDefect.PRO_PROCESS.Select(Function(c) c.CODE_PRO))
For Each c In db.PRO_PROCESS
If selectedProcessHS.Contains(c.CODE_PRO.ToString()) Then
updateDefect.PRO_PROCESS.Add(c)
Else
If defectProcess.Contains(c.CODE_PRO) Then
updateDefect.PRO_PROCESS.Remove(c)
End If
End If

Next

End Sub
KERPLUNK 27/10/2017 09:02:07
#477443
Da mesma maneira que você pode ter um defeito, você pode usar uma lista de defeitos como parâmetro:

Private Sub UpdateDefectProcess(updateDefect As List(Of DEF_DEFECT), processSelected As String)


E assim do mesmo modo para todos os outros métodos.
SOMEBODY 27/10/2017 09:12:11
#477444
Não entendi, peço desculpa

o meu updatedefectprocess foi criado para fazer update na base de dados. porque como os dados são de tabelas diferentes tive de arranjar maneira de conseguir gravar os dados,
Está a dizer para mudar o codigo ou acrescentar?
Fiquei confusa :s
KERPLUNK 27/10/2017 09:22:01
#477445
O que quis dizer é que se você for trabalhar com múltiplos ítens como parâmetro e todos são do mesmo tipo, o mais lógico seria usar List<T> que você pode usar como parâmetro nos lugares onde hoje usa um só.
SOMEBODY 27/10/2017 10:22:21
#477453
Eu experimentei, mas deu logo erro em ...(updateDefect.Pro_Process.Select(Function(c)c.CODE_PRO))
Seria pedir muito para exemplificar, usando o meu codigo?
Eu sou estagiária, ainda estou muito verde na programação, quando surge um erro ainda n sei muito bem como resolver...
  Private Sub UpdateDefectProcess(updateDefect As List(Of DEF_DEFECT), processSelected As String)
[ô]Dim selectedProcessHS = New HashSet(Of String)(processSelected)
Dim selectedProcessHS = processSelected

Dim defectProcess As IEnumerable(Of String) = New HashSet(Of String)(updateDefect.PRO_PROCESS.Select(Function(c) c.CODE_PRO))
For Each c In db.PRO_PROCESS
If selectedProcessHS.Contains(c.CODE_PRO.ToString()) Then
updateDefect.PRO_PROCESS.Add(c)
Else
If defectProcess.Contains(c.CODE_PRO) Then
updateDefect.PRO_PROCESS.Remove(c)
End If
End If

Next
KERPLUNK 27/10/2017 10:34:51
#477455
Bem, não basta mudar a assinatura do método, as partes que trabalham com essas variáveis(parâmetros) também devem ser modificadas de acordo.
SOMEBODY 27/10/2017 10:36:37
#477457
Sim mas mudo pelo que? ou para que codigo?
SOMEBODY 02/11/2017 08:44:31
#477563
Citação:

:
Bem, não basta mudar a assinatura do método, as partes que trabalham com essas variáveis(parâmetros) também devem ser modificadas de acordo.


KERPLUNK será que pode continuar a ajudar-me? Eu sei que é chato explicar detalhadamente ás pessoas que não percebem muito disto, mas para eu aprender tenho de perceber como.
E com o que me disse eu não consigo aplicar no meu exercicio...
Faça seu login para responder