DropDownList with multi selected

0

I have a table defects and one of processes, and a defect can have one or several processes. For now I have to work a dropdownlist for a defect, a process, what changes I need to make to be able to select several processes, follow the code below:

' 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

There is some information available but for #c I have not yet done anything for vb. Someone who can give me some lights?

    
asked by anonymous 25.10.2017 / 17:51

1 answer

0

I changed my code and solved the problem

' 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, ByVal PList As String()) 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)
            UpdateDefectProcess(processToUpdate, PList.ToList)

            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 List(Of 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
    
28.11.2017 / 12:12