# Question about multiple select row from a db table

**URL:** <https://forum.inductiveautomation.com/t/question-about-multiple-select-row-from-a-db-table/116967>\
**Category:** Ignition\
**Tags:** vision\
**Created:** [September 2, 2026, 6:54am UTC](https://forum.inductiveautomation.com/t/question-about-multiple-select-row-from-a-db-table/116967 "2026-09-02T06:54:23Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![luca22](https://avatars.discourse-cdn.com/v4/letter/l/e274bd/32.png) [@luca22](https://forum.inductiveautomation.com/u/luca22)\
**Post date:** [September 2, 2026, 6:54am UTC](https://forum.inductiveautomation.com/t/question-about-multiple-select-row-from-a-db-table/116967/1 "2026-09-02T06:54:23Z")

</div>

Hello,

I've been in this world for 4 months, so sorry if my question is a bit basic.

I'll try to describe it as briefly as I can: I'm working on some filters for a Window in Vision. All my data comes from a DB. One of these filters is a filter by items (it needs to be multi-selectable by operators, not single-target). Right now we have 7/8 items, but I don't know if that number could grow in the future. Anyway, I'm handling the other filters using Vision Client Tags.

My question is: what's a good method for multi-selecting items (touch-friendly) that I can then read from my query once the selection is made? I searched the forum and saw that the "List" component seems perfect for this kind of thing, but the issue I think I'd run into is that multi-row selection only works on PC (via Ctrl + mouse click), and wouldn't be possible in situations where operators only have touch screen access.

I'd prefer a component-based/binding solution over custom scripting, if possible.

I hope I explained myself clearly.

Thank you

Luca

---

<div class="post-metadata">

**Author:** ![zxcslo](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/zxcslo/32/61610_2.png) [@zxcslo](https://forum.inductiveautomation.com/u/zxcslo)\
**Post date:** [September 2, 2026, 8:22am UTC](https://forum.inductiveautomation.com/t/question-about-multiple-select-row-from-a-db-table/116967/2 "2026-09-02T08:22:00Z")

</div>

Have you seen this:

[https://forum.inductiveautomation.com/t/how-to-do-multiple-selection-from-a-vision-list-component/82348/4?u=zxcslo](https://forum.inductiveautomation.com/t/how-to-do-multiple-selection-from-a-vision-list-component/82348/4)

Or this:

[https://forum.inductiveautomation.com/t/multiselect-dropdown-in-vision/58749/7?u=zxcslo](https://forum.inductiveautomation.com/t/multiselect-dropdown-in-vision/58749/7)

Search is very powerfull thing...😇

---

<div class="post-metadata">

**Author:** ![justinedwards.jle](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/justinedwards.jle/32/37854_2.png) [@justinedwards.jle](https://forum.inductiveautomation.com/u/justinedwards.jle)\
**Post date:** [September 2, 2026, 8:27am UTC](https://forum.inductiveautomation.com/t/question-about-multiple-select-row-from-a-db-table/116967/3 "2026-09-02T08:27:08Z")

</div>

I've never tried it on a touchscreen, but I imagine a larger font size could make the rows big enough:  
[Ignition Exchange: MultiSelect Dropdown for Vision](https://inductiveautomation.com/exchange/2581/overview)

It's been a long time since I made that, but I'm pretty sure it uses a JTable under the hood. If there's enough room in your UI, a standard table or power table with the _Selection Mode_ set to _multiple interval_ would be a good choice for this sort of thing.

---

<div class="post-metadata">

**Author:** ![Alejandro\_Alaco](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/alejandro_alaco/32/59849_2.png) [@Alejandro\_Alaco](https://forum.inductiveautomation.com/u/Alejandro_Alaco)\
**Post date:** [September 2, 2026, 2:43pm UTC](https://forum.inductiveautomation.com/t/question-about-multiple-select-row-from-a-db-table/116967/4 "2026-09-02T14:43:15Z")

</div>

4 months is too young to work with computers

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [September 2, 2026, 4:02pm UTC](https://forum.inductiveautomation.com/t/question-about-multiple-select-row-from-a-db-table/116967/5 "2026-09-02T16:02:50Z")

</div>

> [@justinedwards.jle](#):
>
> _Selection Mode_ set to _multiple interval_

This will have the same problem as the list - without ctrl/shift held down, Swing's default behavior is to _move_ the selection, not add to it.

It's technically possible to work around this with the standard list, but distinctly annoying, and probably not worth doing given the OP's other constraints.

> **Clanker Crimes**
>
> ```python
> if event.propertyName == 'componentRunning':
> from javax.swing import DefaultListSelectionModel, ListSelectionModel
> 
> class TouchToggleSelectionModel(ListSelectionModel):
> def __init__ (self, oldModel=None):
> self.delegate = DefaultListSelectionModel()
> self.gestureStarted = False
> 
> if oldModel is not None:
> self.delegate.setSelectionMode(oldModel.getSelectionMode())
> minIndex = oldModel.getMinSelectionIndex()
> maxIndex = oldModel.getMaxSelectionIndex()
> if minIndex >= 0 and maxIndex >= minIndex:
> for index in range(minIndex, maxIndex + 1):
> if oldModel.isSelectedIndex(index):
> self.delegate.addSelectionInterval(index, index)
> 
> def addListSelectionListener(self, listener):
> self.delegate.addListSelectionListener(listener)
> 
> def addSelectionInterval(self, index0, index1):
> self.delegate.addSelectionInterval(index0, index1)
> 
> def clearSelection(self):
> self.delegate.clearSelection()
> 
> def getAnchorSelectionIndex(self):
> return self.delegate.getAnchorSelectionIndex()
> 
> def getLeadSelectionIndex(self):
> return self.delegate.getLeadSelectionIndex()
> 
> def getMaxSelectionIndex(self):
> return self.delegate.getMaxSelectionIndex()
> 
> def getMinSelectionIndex(self):
> return self.delegate.getMinSelectionIndex()
> 
> def getSelectionMode(self):
> return self.delegate.getSelectionMode()
> 
> def getValueIsAdjusting(self):
> return self.delegate.getValueIsAdjusting()
> 
> def insertIndexInterval(self, index, length, before):
> self.delegate.insertIndexInterval(index, length, before)
> 
> def isSelectedIndex(self, index):
> return self.delegate.isSelectedIndex(index)
> 
> def isSelectionEmpty(self):
> return self.delegate.isSelectionEmpty()
> 
> def removeIndexInterval(self, index0, index1):
> self.delegate.removeIndexInterval(index0, index1)
> 
> def removeListSelectionListener(self, listener):
> self.delegate.removeListSelectionListener(listener)
> 
> def removeSelectionInterval(self, index0, index1):
> self.delegate.removeSelectionInterval(index0, index1)
> 
> def setAnchorSelectionIndex(self, index):
> self.delegate.setAnchorSelectionIndex(index)
> 
> def setLeadSelectionIndex(self, index):
> self.delegate.setLeadSelectionIndex(index)
> 
> def setSelectionInterval(self, index0, index1):
> if not self.gestureStarted:
> if self.delegate.isSelectedIndex(index0):
> self.delegate.removeSelectionInterval(index0, index1)
> else:
> self.delegate.addSelectionInterval(index0, index1)
> self.gestureStarted = True
> 
> def setSelectionMode(self, selectionMode):
> self.delegate.setSelectionMode(selectionMode)
> 
> def setValueIsAdjusting(self, isAdjusting):
> if not isAdjusting:
> self.gestureStarted = False
> self.delegate.setValueIsAdjusting(isAdjusting)
> 
> jList = event.source.viewport.view
> 
> oldModel = jList.getSelectionModel()
> newModel = TouchToggleSelectionModel(oldModel)
> newModel.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION)
> 
> jList.setSelectionModel(newModel)
> 
> ```

---

<div class="post-metadata">

**Author:** ![lane.duncan](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/lane.duncan/32/83700_2.png) [@lane.duncan](https://forum.inductiveautomation.com/u/lane.duncan)\
**Post date:** [September 3, 2026, 5:03am UTC](https://forum.inductiveautomation.com/t/question-about-multiple-select-row-from-a-db-table/116967/6 "2026-09-03T05:03:26Z")

</div>

> [@luca22](#):
>
> Right now we have 7/8 items

If it’s less than a dozen or so items I would consider a pop-up window with some simple labels and check boxes.

If it grows much larger than that I would use a table tied to a dataset tag with a selectable Boolean column to utilize available table filtering techniques.

---

<div class="post-metadata">

**Author:** ![justinedwards.jle](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/justinedwards.jle/32/37854_2.png) [@justinedwards.jle](https://forum.inductiveautomation.com/u/justinedwards.jle)\
**Post date:** [September 3, 2026, 8:28am UTC](https://forum.inductiveautomation.com/t/question-about-multiple-select-row-from-a-db-table/116967/7 "2026-09-03T08:28:31Z")

</div>

> [@paul-griffith](#):
>
> without ctrl/shift held down

😬 I see the problem

> [@lane.duncan](#):
>
> check boxes

It's trivial to add an editable boolean column to a table, so that would be a viable solution even if there are many rows.

> [@luca22](#):
>
> data comes from a DB

You could modify the query to include an arbitrary boolean column, or you could put the raw data from the query on a custom property, and add the column and data to the table on a property change event. The user could then select the rows using the checkboxes without having to do anything funky.

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [September 3, 2026, 1:28pm UTC](https://forum.inductiveautomation.com/t/question-about-multiple-select-row-from-a-db-table/116967/8 "2026-09-03T13:28:26Z")

</div>

> [@justinedwards.jle](#):
>
> add the column and data to the table on a property change event

_Psssst!_ Try my Integration Toolkit's [selectStar()](https://www.automation-pros.com/toolkit/doc/datasets.html#selectstar) function in the table data binding. Something like:

```python
selectStar({path.to.raw.dataset}, asMap('toggleName', 'b'), false)

```

That will deliver the toggles pre-set to off when the raw data changes.
