cancel
Showing results for 
Search instead for 
Did you mean: 
Reply
Anonymous
Not applicable

Cascading Combo Box

Hello,

 

I had previously customized a SharePoint list form using PowerApps successfully early in January. However, after the 1/18/2018 updates, I can no longer customoize a SharePoint list form the same way.

 

I have a SharePoint list, Expense Report, that is going to be used to record expenese incurred on projects.  This list has 2 SharePont lookup fields from 2 other SharePoint lists - Clients and Projects.  We'll first select the Client and then based on that the associated Projects would be displayed for selection.  Previously, I had done this using galleries and within the edit form the Client and Project fields were automatically populated with the selections made within the galleries (I used WonderLaura's videos/blog posts).  The fields within the edit form were the Lookup control that was provided; however, now it seems the Lookup control has been replaced with a Combo Box control.

 

I have not been able to find much guidance on the use of Combo Boxes and it is unclear to me what properties to use and modify in order to be able to record the selection of Client and Project from the galleries set up.  This is the formula i had previously used for the Lookup controls for the Default property of the data card:

 

{ '@odata.type' : "Microsoft.Azure.Connectors.SharePoint.SPListExpandedReference", Id : Value(GalleryClient.Selected.ID), Value: GalleryClient.Selected.Title}

 

Does anyone have any recommendations with how to achieve cascading combo boxes and create records for a SharePoint list using customized PowerApps forms?

 

1 ACCEPTED SOLUTION

Accepted Solutions
R3dKap
Community Champion
Community Champion

Hi all,

 

After struggling for a long time with combo boxes and cascading them, I've come up with an easy logic to follow when it comes to manipulating combo boxes.

So here are a few tips and tricks on this particular topic...

 

When you customize a form in PowerApps, the system automatically sets a field as a combo box if its datatype is one of the following:

  • Choice field
  • Lookup field
  • Managed metadata field
  • User field

But you already know this... Smiley Happy

 

The structure of the items in the combo box will then vary according to the field's data type:

  • Choice field

 

{
    Value
}

 

  • Lookup field

 

{
    Id,
    Value
}

 

  • Managed metadata field

 

{
    Label,
    Path,
    TermGuid,
    Value, /* <label>|<guid> */
    WssId
}

 

  • User field

 

{
    Claims,
    Department,
    DisplayName,
    Email,
    JobTitle,
    Picture
}

 

But you probably already know this as well.

 

What is interesting to understand is that, whatever the data type of the field (whatever the structure of the combo box items), the Items property will always be defined as:

 

Choices(<your datasource>.<your field>)

 

 

Here comes the important part...

 

Whatever you want to do with your combo box (define a default value, cascade combo boxes, filter the list of items in your combo box) consider the Choices(...) 'function' as your 'combo box datasource'. You have to respect the data type of your combo box items by always working with the Choices(...) 'items list'.

And forget about using the { '@odata.type' : "Microsoft.Azure.Connectors.SharePoint. ...", Id : ..., Value: ...} artefact (which is usefull in very limited cases, by example for setting a default user in a user field).

 

This means that, if you want to set a default value for your combo box, do it this way (always use the DefaultSelectedItems property):

 

LookUp(Choices(<your datasource>.<your field>), Value='<your default value>')

 

 

It also means that if you want to filter the list of items in your combo box, you have to do it this way:

 

Filter(Choices(<your datasource>.<your field>), <your filter condition>)

 

 

And if you want to cascade lookup combo boxes, you should do it this way:

 

Filter(
Choices(<datasource>.<lookup field>),
Id in ShowColumns(
Filter(<lookup list>,<your condition>),
"ID"
)
)

A bit of an explanation here...

 

The Filter(Choices(...),...) part does not change. We want to filter our combo box 'datasource'.

Then, for the filter condition, we can only use the Id or the Value properties. Here I use the Id property.

Now, the Id in... part means: "I want to specify which items in my Choices(...) I want to keep as items for the combo box."

Since the left-side of the in operator is the Id 'column', on the right side of the in operator I must have a list of ids. That's why I use the ShowColumns(..., "ID") function.

Finally, inside the ShowColumns function, the datasource (first parameter) is where I will filter my lookup items. And in the filter condition I can just filter on any other field in the lookup list.

 

Here is an example... Let's say you have the following lists:

  • Countries
    • CountryName (text)
  • Cities
    • CityName (text)
    • Country (lookup to Countries>CountryName)
  •  Companies
    • CompanyName (text)
    • CompanyCountry (lookup to Countries>CountryName)
    • CompanyCity (lookup to Cities>CityName)

Let's say that you customize the Companies list form and that you want the following behavior: after choosing a country in CompanyCountry combo box, I want the CompanyCity combo box to show me only cities from that country.

Here is how you should set the Items property of the CompanyCity combo box:

 

Filter(
    Choices(Companies.CompanyCity),
    Id in ShowColumns(
        Filter(Cities,Country.Id=DataCardValueCompanyCountry.Selected.Id),
        "ID"
    )
)

 

 

Note: PowerApps provides now an automatic way of cascading combo boxes:

Image 1.png

 

Hope this helped...

Emmanuel

View solution in original post

45 REPLIES 45
Meneghino
Community Champion
Community Champion

Hello @Anonymous

My constant recommendation is not to use the standard forms, but to build your own.

How to implement cascading dropdowns/combo boxes depends a bit on the data structure otherwise you risk running into performance issues.  I am happy to hop ona a Skype call to give you some hints/help.  Will send contacts via private message.

did you ever get an answer on this?

 

Cascading Combobox is pretty common now ...

I am too seraching easy sol for multi select cascading combo box.. till the date.. 


@skylitedave wrote:

did you ever get an answer on this?

 

Cascading Combobox is pretty common now ...


 

R3dKap
Community Champion
Community Champion

Hi all,

 

After struggling for a long time with combo boxes and cascading them, I've come up with an easy logic to follow when it comes to manipulating combo boxes.

So here are a few tips and tricks on this particular topic...

 

When you customize a form in PowerApps, the system automatically sets a field as a combo box if its datatype is one of the following:

  • Choice field
  • Lookup field
  • Managed metadata field
  • User field

But you already know this... Smiley Happy

 

The structure of the items in the combo box will then vary according to the field's data type:

  • Choice field

 

{
    Value
}

 

  • Lookup field

 

{
    Id,
    Value
}

 

  • Managed metadata field

 

{
    Label,
    Path,
    TermGuid,
    Value, /* <label>|<guid> */
    WssId
}

 

  • User field

 

{
    Claims,
    Department,
    DisplayName,
    Email,
    JobTitle,
    Picture
}

 

But you probably already know this as well.

 

What is interesting to understand is that, whatever the data type of the field (whatever the structure of the combo box items), the Items property will always be defined as:

 

Choices(<your datasource>.<your field>)

 

 

Here comes the important part...

 

Whatever you want to do with your combo box (define a default value, cascade combo boxes, filter the list of items in your combo box) consider the Choices(...) 'function' as your 'combo box datasource'. You have to respect the data type of your combo box items by always working with the Choices(...) 'items list'.

And forget about using the { '@odata.type' : "Microsoft.Azure.Connectors.SharePoint. ...", Id : ..., Value: ...} artefact (which is usefull in very limited cases, by example for setting a default user in a user field).

 

This means that, if you want to set a default value for your combo box, do it this way (always use the DefaultSelectedItems property):

 

LookUp(Choices(<your datasource>.<your field>), Value='<your default value>')

 

 

It also means that if you want to filter the list of items in your combo box, you have to do it this way:

 

Filter(Choices(<your datasource>.<your field>), <your filter condition>)

 

 

And if you want to cascade lookup combo boxes, you should do it this way:

 

Filter(
Choices(<datasource>.<lookup field>),
Id in ShowColumns(
Filter(<lookup list>,<your condition>),
"ID"
)
)

A bit of an explanation here...

 

The Filter(Choices(...),...) part does not change. We want to filter our combo box 'datasource'.

Then, for the filter condition, we can only use the Id or the Value properties. Here I use the Id property.

Now, the Id in... part means: "I want to specify which items in my Choices(...) I want to keep as items for the combo box."

Since the left-side of the in operator is the Id 'column', on the right side of the in operator I must have a list of ids. That's why I use the ShowColumns(..., "ID") function.

Finally, inside the ShowColumns function, the datasource (first parameter) is where I will filter my lookup items. And in the filter condition I can just filter on any other field in the lookup list.

 

Here is an example... Let's say you have the following lists:

  • Countries
    • CountryName (text)
  • Cities
    • CityName (text)
    • Country (lookup to Countries>CountryName)
  •  Companies
    • CompanyName (text)
    • CompanyCountry (lookup to Countries>CountryName)
    • CompanyCity (lookup to Cities>CityName)

Let's say that you customize the Companies list form and that you want the following behavior: after choosing a country in CompanyCountry combo box, I want the CompanyCity combo box to show me only cities from that country.

Here is how you should set the Items property of the CompanyCity combo box:

 

Filter(
    Choices(Companies.CompanyCity),
    Id in ShowColumns(
        Filter(Cities,Country.Id=DataCardValueCompanyCountry.Selected.Id),
        "ID"
    )
)

 

 

Note: PowerApps provides now an automatic way of cascading combo boxes:

Image 1.png

 

Hope this helped...

Emmanuel

Hi @R3dKap 

but question is

how we can cascde if we select two or more items in companycountry combo

Suppose I select China and India in companycountry combo then i should get option to select city coresponding to it's country eg 

see attachment.. i could not solve it 😞

 


@R3dKap wrote:

Hi all,

 

After struggling for a long time with combo boxes and cascading them, I've come up with an easy logic to follow when it comes to manipulating combo boxes.

So here are a few tips and tricks on this particular topic...

 

When you customize a form in PowerApps, the system automatically sets a field as a combo box if its datatype is one of the following:

  • Choice field
  • Lookup field
  • Managed metadata field
  • User field

But you already know this... Smiley Happy

 

The structure of the items in the combo box will then vary according to the field's data type:

  • Choice field

 

{
    Value
}

 

  • Lookup field

 

{
    Id,
    Value
}

 

  • Managed metadata field

 

{
    Label,
    Path,
    TermGuid,
    Value, /* <label>|<guid> */
    WssId
}

 

  • User field

 

{
    Claims,
    Department,
    DisplayName,
    Email,
    JobTitle,
    Picture
}

 

But you probably already know this as well.

 

What is interesting to understand is that, whatever the data type of the field (whatever the structure of the combo box items), the Items property will always be defined as:

 

Choices(<your datasource>.<your field>)

 

 

Here comes the important part...

 

Whatever you want to do with your combo box (define a default value, cascade combo boxes, filter the list of items in your combo box) consider the Choices(...) 'function' as your 'combo box datasource'. You have to respect the data type of your combo box items by always working with the Choices(...) 'items list'.

And forget about using the { '@odata.type' : "Microsoft.Azure.Connectors.SharePoint. ...", Id : ..., Value: ...} artefact (which is usefull in very limited cases, by example for setting a default user in a user field).

 

This means that, if you want to set a default value for your combo box, do it this way (always use the DefaultSelectedItems property):

 

LookUp(Choices(<your datasource>.<your field>), Value='<your default value>')

 

 

It also means that if you want to filter the list of items in your combo box, you have to do it this way:

 

Filter(Choices(<your datasource>.<your field>), <your filter condition>)

 

 

And if you want to cascade lookup combo boxes, you should do it this way:

 

Filter(
Choices(<datasource>.<lookup field>),
Id in ShowColumns(
Filter(<lookup list>,<your condition>),
"ID"
)
)

A bit of an explanation here...

 

The Filter(Choices(...),...) part does not change. We want to filter our combo box 'datasource'.

Then, for the filter condition, we can only use the Id or the Value properties. Here I use the Id property.

Now, the Id in... part means: "I want to specify which items in my Choices(...) I want to keep as items for the combo box."

Since the left-side of the in operator is the Id 'column', on the right side of the in operator I must have a list of ids. That's why I use the ShowColumns(..., "ID") function.

Finally, inside the ShowColumns function, the datasource (first parameter) is where I will filter my lookup items. And in the filter condition I can just filter on any other field in the lookup list.

 

Here is an example... Let's say you have the following lists:

  • Countries
    • CountryName (text)
  • Cities
    • CityName (text)
    • Country (lookup to Countries>CountryName)
  •  Companies
    • CompanyName (text)
    • CompanyCountry (lookup to Countries>CountryName)
    • CompanyCity (lookup to Cities>CityName)

Let's say that you customize the Companies list form and that you want the following behavior: after choosing a country in CompanyCountry combo box, I want the CompanyCity combo box to show me only cities from that country.

Here is how you should set the Items property of the CompanyCity combo box:

 

Filter(
    Choices(Companies.CompanyCity),
    Id in ShowColumns(
        Filter(Cities,Country.Id=DataCardValueCompanyCountry.Selected.Id),
        "ID"
    )
)

 

 

Note: PowerApps provides now an automatic way of cascading combo boxes:

Image 1.png

 

Hope this helped...

Emmanuel


 

R3dKap
Community Champion
Community Champion

And if your CompanyCountry field allows multiple selections and you want to see the cities for the selected countries (which could be a bit confusing by the way), you could just change the Filter function to something like this:

Filter(
    Choices(Companies.CompanyCity),
    Id in ShowColumns(
        Filter(Cities,Country.Id in ShowColumns(DataCardValueCompanyCountry.SelectedItems, "Id")),
        "ID"
    )
)

I haven't test it, so give me feedback about it...

Emmanuel

Wow! It works now..

Few things that i added...

in sharepont list in lookup, I  allowed multiple values

Also on visible property i added collection collcities to collect the cities details...

 

Items for companyciites looks:

Filter(Choices(Companies.CompanyCity), Id in ShowColumns(Filter(collcities,Country.Id in ShowColumns(DataCardValue2.SelectedItems,"Id")),"ID"))

 

Thanks a lots @R3dKap 

Anonymous
Not applicable

Hi @R3dKap ,

 

I am new to this tool and thank you for nice explanation of Combobox.

I am trying to create cascading comboboxes and my data source is a table (Table7) from excel and my data will be something like as shown below
image.png

Now when i try to set the Items for one combobox as "Choices(Table7.Column1)" i am getting below error:

image.png

 

Also can you please help me how can set 3 combo boxes one for each Column in my table and also they should show distinct values i.e

Combo box 1 - Shows A1, A2(distinct of Column1)
Combo box 2 - Shows distinct values from Column2 based on selected values from Combobox 1

 

thanks,

-Dileep

Hi @Anonymous,

Ok, here is the solution (just tested it on my side):

ComboBox1
    Items -> Distinct(Table7,Column1)
    DisplayFields -> ["Result"]
    SearchFields -> ["Result"]
    SelectMultiple -> false
    OnChange -> UpdateContext({locCol2WrongValue: IsBlank(LookUp(MyTable,Column1=ComboBox1.Selected.Result && Column2=ComboBox2.Selected.Result))})

ComboBox2
Items -> Distinct(Filter(Table7,Column1=ComboBox1.Selected.Result),Column2)
DisplayFields -> ["Result"]
SearchFields -> ["Result"]
SelectMultiple -> false
Reset -> locCol2WrongValue
OnChange -> UpdateContext({locCol2WrongValue:false}); UpdateContext({locCol3WrongValue: IsBlank(LookUp(MyTable,Column1=ComboBox1.Selected.Result && Column2=ComboBox2.Selected.Result && Column3=ComboBox3.Selected.Result))})

ComboBox3
 Items -> Distinct(Filter(Table7,Column1=ComboBox1.Selected.Result && Column2=ComboBox2.Selected.Result),Column3)
DisplayFields -> ["Result"]
SearchFields -> ["Result"]
SelectMultiple -> false
Reset -> locCol2WrongValue || locCol3WrongValue
OnChange -> UpdateContext({locCol3WrongValue:false})

As you can see, I've added some code to the OnChange events of the combo boxes so that when the users has selected A1 & B3 and then he changes his mind and chooses A2, the ComboBox2 is reset and blanked because combination A2 & B3 does not exist.

Tell us if this works...

Emmanuel

PS: I hope I didn't forget anything... 🙂

Helpful resources

Announcements

Community will be READ ONLY July 16th, 5p PDT -July 22nd

Dear Community Members,   We'd like to let you know of an upcoming change to the community platform: starting July 16th, the platform will transition to a READ ONLY mode until July 22nd.   During this period, members will not be able to Kudo, Comment, or Reply to any posts.   On July 22nd, please be on the lookout for a message sent to the email address registered on your community profile. This email is crucial as it will contain your unique code and link to register for the new platform encompassing all of the communities.   What to Expect in the New Community: A more unified experience where all products, including Power Apps, Power Automate, Copilot Studio, and Power Pages, will be accessible from one community.Community Blogs that you can syndicate and link to for automatic updates. We appreciate your understanding and cooperation during this transition. Stay tuned for the exciting new features and a seamless community experience ahead!

Summer of Solutions | Week 4 Results | Winners will be posted on July 24th

We are excited to announce the Summer of Solutions Challenge!   This challenge is kicking off on Monday, June 17th and will run for (4) weeks.  The challenge is open to all Power Platform (Power Apps, Power Automate, Copilot Studio & Power Pages) community members. We invite you to participate in a quest to provide solutions in the Forums to as many questions as you can. Answers can be provided in all the communities.    Entry Period: This Challenge will consist of four weekly Entry Periods as follows (each an “Entry Period”)   - 12:00 a.m. PT on June 17, 2024 – 11:59 p.m. PT on June 23, 2024 - 12:00 a.m. PT on June 24, 2024 – 11:59 p.m. PT on June 30, 2024 - 12:00 a.m. PT on July 1, 2024 – 11:59 p.m. PT on July 7, 2024 - 12:00 a.m. PT on July 8, 2024 – 11:59 p.m. PT on July 14, 2024   Entries will be eligible for the Entry Period in which they are received and will not carryover to subsequent weekly entry periods.  You must enter into each weekly Entry Period separately.   How to Enter: We invite you to participate in a quest to provide "Accepted Solutions" to as many questions as you can. Answers can be provided in all the communities. Users must provide a solution which can be an “Accepted Solution” in the Forums in all of the communities and there are no limits to the number of “Accepted Solutions” that a member can provide for entries in this challenge, but each entry must be substantially unique and different.    Winner Selection and Prizes: At the end of each week, we will list the top ten (10) Community users which will consist of: 5 Community Members & 5 Super Users and they will advance to the final drawing. We will post each week in the News & Announcements the top 10 Solution providers.  At the end of the challenge, we will add all of the top 10 weekly names and enter them into a random drawing.  Then we will randomly select ten (10) winners (5 Community Members & 5 Super Users) from among all eligible entrants received across all weekly Entry Periods to receive the prize listed below. If a winner declines, we will draw again at random for the next winner.  A user will only be able to win once overall. If they are drawn multiple times, another user will be drawn at random.  Individuals will be contacted before the announcement with the opportunity to claim or deny the prize.  Once all of the winners have been notified, we will post in the News & Announcements of each community with the list of winners.   Each winner will receive one (1) Pass to the Power Platform Conference in Las Vegas, Sep. 18-20, 2024 ($1800 value). NOTE: Prize is for conference attendance only and any other costs such as airfare, lodging, transportation, and food are the sole responsibility of the winner. Tickets are not transferable to any other party or to next year’s event.   ** PLEASE SEE THE ATTACHED RULES for this CHALLENGE**   Week 1 Results: Congratulations to the Week 1 qualifiers, you are being entered in the random drawing that will take place at the end of the challenge. Community MembersNumber of SolutionsSuper UsersNumber of Solutions @anandm08  23 @WarrenBelz  31 @DBO_DV  10 @Amik  19 AmínAA 6 @mmbr1606  12 @rzuber  4 @happyume  7 @Giraldoj  3@ANB 6 (tie)   @SpongYe  6 (tie)     Week 2 Results: Congratulations to the Week 2 qualifiers, you are being entered in the random drawing that will take place at the end of the challenge. Community MembersSolutionsSuper UsersSolutions @anandm08  10@WarrenBelz 25 @DBO_DV  6@mmbr1606 14 @AmínAA 4 @Amik  12 @royg  3 @ANB  10 @AllanDeCastro  2 @SunilPashikanti  5 @Michaelfp  2 @FLMike  5 @eduardo_izzo  2   Meekou 2   @rzuber  2   @Velegandla  2     @PowerPlatform-P  2   @Micaiah  2     Week 3 Results: Congratulations to the Week 3 qualifiers, you are being entered in the random drawing that will take place at the end of the challenge.   Week 3:Community MembersSolutionsSuper UsersSolutionsPower Apps anandm0861WarrenBelz86DBO_DV25Amik66Michaelfp13mmbr160647Giraldoj13FLMike31AmínAA13SpongYe27     Week 4 Results: Congratulations to the Week 4 qualifiers, you are being entered in the random drawing that will take place at the end of the challenge.   Week 4:Community MembersSolutionsSuper UsersSolutionsPower Apps DBO-DV21WarranBelz26Giraldoj7mmbr160618Muzammmil_0695067Amik14samfawzi_acml6FLMike12tzuber6ANB8   SunilPashikanti8

Check Out | 2024 Release Wave 2 Plans for Microsoft Dynamics 365 and Microsoft Power Platform

On July 16, 2024, we published the 2024 release wave 2 plans for Microsoft Dynamics 365 and Microsoft Power Platform. These plans are a compilation of the new capabilities planned to be released between October 2024 to March 2025. This release introduces a wealth of new features designed to enhance customer understanding and improve overall user experience, showcasing our dedication to driving digital transformation for our customers and partners.    The upcoming wave is centered around utilizing advanced AI and Microsoft Copilot technologies to enhance user productivity and streamline operations across diverse business applications. These enhancements include intelligent automation, AI-powered insights, and immersive user experiences that are designed to break down barriers between data, insights, and individuals. Watch a summary of the release highlights.    Discover the latest features that empower organizations to operate more efficiently and adaptively. From AI-driven sales insights and customer service enhancements to predictive analytics in supply chain management and autonomous financial processes, the new capabilities enable businesses to proactively address challenges and capitalize on opportunities.    

Updates to Transitions in the Power Platform Communities

We're embarking on a journey to enhance your experience by transitioning to a new community platform. Our team has been diligently working to create a fresh community site, leveraging the very Dynamics 365 and Power Platform tools our community advocates for.  We started this journey with transitioning Copilot Studio forums and blogs in June. The move marks the beginning of a new chapter, and we're eager for you to be a part of it. The rest of the Power Platform product sites will be moving over this summer.   Stay tuned for more updates as we get closer to the launch. We can't wait to welcome you to our new community space, designed with you in mind. Let's connect, learn, and grow together.   Here's to new beginnings and endless possibilities!   If you have any questions, observations or concerns throughout this process please go to https://aka.ms/PPCommSupport.   To stay up to date on the latest details of this migration and other important Community updates subscribe to our News and Announcements forums: Copilot Studio, Power Apps, Power Automate, Power Pages

Users online (1,468)