First, to the issue of other Controls "showing through:" unless you are using a UserControl that implements transparency (and getting a Windows Form UserControl to have any useful transparency is a dubious proposition), the only way any other control can "show through," is if it is placed on top of your UserControl. So, use 'BringToFront() on your UserControl at the right time.
There's a much easier way to achieve what you want, whether as just another Control on the Form, or encapsulated within a UserControl:
At design-time, or in code:
1. add a ListView Control: set its 'View property to 'Details
2. add one ColumnHeader to the ListView's Columns collection, with its Text property set to something like "Pick one or more items" : specify a width for that ColumnHeader about equal to the width of the ListView
3. set the ListView's MultiSelect property to 'true.
4. set the design-time ListView's height property so only text in ColumnHeader1 is visible.
5. add items you want the user to select one or more of to the ListView's Items collection of ListViewItems, assign their 'Text property to whatever's appropriate for your use-case.
In the main Form's code this will prepare you to handle the user's selection, and creating the drop-down and fold-up effects:
private int lvDefaultHeight;
private ListView.SelectedListViewItemCollection lvSelectedItems;
private void YourMainForm_Load(object sender, EventArgs e)
{
lvDefaultHeight = listView1.Height;
lvSelectedItems = new ListView.SelectedListViewItemCollection(listView1);
}
To make the ListItems appear when you click on ColumnHeader1 (i.e., to drop-down), handle the ListView's ColumnClick Event:
private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
{
listView1.Height = lvDefaultHeight * listView1.Items.Count;
}
So, now, at run-time, the user clicked on the ColumnHeader1, the List dropped down, and the user selects one, or any, or all, items. So: how to enable the user to "finish" ? One way is to treat the user's hitting the Return key to indicate that they are done. Handling the ListView KeyDown event is one way:
private void listView1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Return)
{
lvSelectedItems = listView1.SelectedItems;
foreach (ListViewItem lvi in lvSelectedItems)
{
Console.WriteLine(lvi.Text);
}
listView1.Height = lvDefaultHeight;
}
}
By the way, you could obviously do a lot more "fancy stuff" with this. When I implement something like this, my usual choice is to make it a UserControl, and expose the appropriate Properties, and/or raise Events, for "consumers" of the UserControl, because I am a paid-up member of the cult of Reusability :)