DROPDOWNLIST COM MULTIPLA SELEÇÃO

 Tópico anterior Próximo tópico Novo tópico

DROPDOWNLIST COM MULTIPLA SELEÇÃO

VB.NET

 Compartilhe  Compartilhe  Compartilhe
#477442 - 27/10/2017 08:30:19

SOMEBODY
AVEIRO
Cadast. em:Outubro/2017


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




#477443 - 27/10/2017 09:02:07

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
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.

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#477444 - 27/10/2017 09:12:11

SOMEBODY
AVEIRO
Cadast. em:Outubro/2017


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



#477445 - 27/10/2017 09:22:01

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
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ó.

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#477453 - 27/10/2017 10:22:21

SOMEBODY
AVEIRO
Cadast. em:Outubro/2017


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




#477455 - 27/10/2017 10:34:51

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
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.

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#477457 - 27/10/2017 10:36:37

SOMEBODY
AVEIRO
Cadast. em:Outubro/2017


Sim mas mudo pelo que? ou para que codigo?



#477563 - 02/11/2017 08:44:31

SOMEBODY
AVEIRO
Cadast. em:Outubro/2017


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...



 Tópico anterior Próximo tópico Novo tópico


Para responder este tópico o login é requerido
Se você já possui uma conta de usuário por favor faça seu login
Se você não possui uma conta de usuário use a opção Criar usuário