Ir para conteúdo
Fórum Script Brasil
  • 0

DropDownList com multi selected


somebody_pt

Pergunta

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

Estou a usar VB.NET

Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...