C# DropDown smart logic implementation

Hi Experts,

I've got a ComboBox in ComboBoxStyle.DropDownList style.

Dropdown selection
This gets dunamically created based on the number of a passed parameter. The letters is an ArrayList of letters which are added to the dropdown

for (int a = i; a < drivesLetters.Count; a++)
       {
          combobox.Items.Add(drivesLetters[a]);
       }

Open in new window


I've been trying to create a method so that when I click on a dropdown list, the letters which are already selected should not show up from the selections. Like on the image above, If I click on M, then M should not show up. If I select V, then V should be selected, not show on the list, M should be added.

I'm not sure how to actually do this. I wonder if I should have two ArrayLists (one holds the letters used in the dropdown, and another one to hold all the unused letters).

I am looking at an exact implementation like this (in javascript) but obviously in C#. I've tried to convert the javascript method to C#, but I was not successful.

Please kindly point me to a good starting point. I've tried so many methods, but no success..

Thanks!
LVL 1
John SolomonSoftware DeveloperAsked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Kyle AbrahamsSenior .Net DeveloperCommented:
You can use the drawItem event.  (http://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.drawitem(v=vs.110).aspx)

Something like:

  private void ComboBox1_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)
        {
            if (e.Index == ComboBox1.SelectedIndex)
                e.Graphics.FillRectangle(new SolidBrush(Color.White), new Rectangle(2,e.Bounds.Top+2, e.Bounds.Width, 0));
        }

Open in new window

John SolomonSoftware DeveloperAuthor Commented:
Hi Kyle Abrahams, thank you for your answer. However, I am not sure how this method would achieve my goal.
If index is equal to combobox selectedIndex, then redraw a rectangle combobox?.

I might have confused you with my question, and I see that the javascript link was not working.. I was hoping to get something like this combo box selection implementation.

Where a number of comboboxes {combo1, combo2. combo3} are filled with a list of letters {A,B,C,D,E, F, G, H}. In order to prevent a user from choosing the same letter A in combo1 and combo3, if A is already selected in combo1, then it should not show up in combo3 dropdown. Given than letter A is unselected in combo1 and is not selected in any other comboboxes, then letter A should be available in a comboboxes dropdown as selectable.

Thank you very much for your help :)
John SolomonSoftware DeveloperAuthor Commented:
Hi Kyle, or an implementation like this. Thanks
C++ 11 Fundamentals

This course will introduce you to C++ 11 and teach you about syntax fundamentals.

John SolomonSoftware DeveloperAuthor Commented:
Or this is a closer implementation that I am looking for javascripcode

I'll try to learn and convert this code into C#. But your help will be greatly appreciated. :) thanks!
Kyle AbrahamsSenior .Net DeveloperCommented:
Hi John,

Okay, that makes a lot more sense.

What I was proposing was let's say you chose "M" . . . you would not want to see "M" in the same combo box in the values again.  That's not usually the default but I don't question people's intentions.

This should work:

PopulateCombos(ComboBox MychangedCombo)
{
    string drive1 = combo1.Text;
    string drive2 = combo2.Text;
    string drive3 = combo3.Text;
  


// populate 1 - do not populate if that's the one that was changed)
   if (MychangedCombo != combo1)
  {
     combobox1.items.Clear();
     for (int a = 0; a < drivesLetters.Count; a++)
       {
               if (drivesLetters[a] == drive2 || drivesLetters[a]  == drive3)
                    continue;
        
                  combobox1.Items.Add(drivesLetters[a]);
                   comboBox1.Text = drive1;
       }
  
//repeat for 2 && 3  
 }
}

You can then wire all 3 combo_selectedIndexchanged to:

DrivesChanged(object sender, eventargs e)
{
   PopulateCombos((ComboBox) sender);
}

Open in new window

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
ste5anSenior DeveloperCommented:
Without having a VS currently at hands, my approach would be using the MeasureItem event to set the height of the item to 0 and skip it in your own owner draw event.
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Algorithms

From novice to tech pro — start learning today.