I have a Enum which I am binding to ComboBox.
But i dont want to show one enum value in combobox items.
If I try to remove after binding it is throwing error.
cmbDisplayUnit.Items.Remove(item);
Is it possible to binding to enum and still removing or atleast hiding one of the values of Enum?
If you look at this MSDN Forum article it gives an example on how to do what you are wanting. See Sorrocco's answer.
Modified from above link:
string[] TestNames = Enum.GetNames(typeof(SampleEnumUnits));
var list = from test in TestNames where test != "Enum you wish to remove" select Enum.Parse(typeof(SampleEnumUnits), test);
cmbDisplayUnit.ItemsSource = list;
I think you need this:
cmbDisplayUnit.Items.Remove((int)item); // I assume item is enum variable
var items = Enum.GetValues(typeof(datMHD.Enums.EquipmentEnums.Request_ItemType));
var List = items.OfType<datMHD.Enums.EquipmentEnums.Request_ItemType>().ToList();
List.RemoveAll(e => e.Equals(datMHD.Enums.EquipmentEnums.Request_ItemType.Spare_Parts));
You convert the Array values to List then use RemoveAll then Assign the Item to a combo box
Related
I'm looking for some help, I'm new with C# and i'm trying to make a combobox with custom indexes, I was adding the items this way
mycb.Items.Add("My value 1");
mycb.Items.Add("My value 2");
by this way I get these indexes by default 0 and 1 so I try to give the indexes that I want to the CB using Insert
mycb.Items.Insert(5,"My value 1");
mycb.Items.Insert(6,"My value 2");
this way the CB should have the indexes 5 and 6 but this is not working because when I select one of those options this error appeared
invalid argument=value of '5' is not valid for 'index'
It works when I add consecutive indexes starting by 0 but that is not what I want, how can I add the indexes that I want to the CB without having this issue? I hope you can help me, thanks.
You would make a dictionary (or array) of the items, assign it as the datasource for the combobox and set the "DisplayMember" and "ValueMember" of the combobox, like this:
Dictionary<int, string> myDictionary = new Dictionary<int, string>();
myDictionary.Add(1, "string");
myDictionary.Add(2, "string2");
myDictionary.Add(4, "string4");
mycb.DataSource = myDictionary.ToArray();
mycb.DisplayMember = "Value";
mycb.ValueMember = "Key";
Maybe adding object instead of custom index?
Referring to MSDN ComboBox.Items documentation
Although the ComboBox is typically used to display text items, you can add any object to the ComboBox. Typically, the representation of an object in the ComboBox is the string returned by that object's ToString method. If you want to have a member of the object displayed instead, choose the member that will be displayed by setting the DisplayMember property to the name of the appropriate member. You can also choose a member of the object that will represent the value returned by the object by setting the ValueMember property. For more information, see ListControl.
Code from MSDN ListControl.ValueMember documentation example
ArrayList USStates = new ArrayList();
USStates.Add(new USState("Alabama", "AL"));
USStates.Add(new USState("Washington", "WA"));
USStates.Add(new USState("West Virginia", "WV"));
USStates.Add(new USState("Wisconsin", "WI"));
USStates.Add(new USState("Wyoming", "WY"));
ListBox1.DataSource = USStates;
I have a dropwdown list with few items like this(in the format "name-number"):
George Michael - 456456
Justin Dukes - 5644654
Peter Heins - 5456454
Mark Twain - 4454564
Now i have to delete an item from the above list based on the value i have from other query.
My other query gives me a number in string format and i have to remove exactly the same item which is in the above dropdownlist second part(after hyphen).
For ex: My query gives me "5456454".
Now I have to remove the third item(Peter Heins - 5456454) from the dropdownlist which matches with the number my query returns.
I am trying to use
ddl.Items.Remove
But Im not getting what parameter i should pass. Both the text and value fields are same in the dropdownlist and i cannot modify that. So i cannot use
ddl.Items.FindByValue()
Any help?
Thanks in advance.
You could do something like this:
var removeItem = ddl.Items.Cast<ListItem>()
.Where(x => x.Value.Contains(number))
.FirstOrDefault()
ddl.Items.Remove(removeItem);
If you're populating your DropDownList with ListItem objects, I would set the text for example to "Peter Heins - 5456454" and the value to "5456454".
ListItem exampleItem = new ListItem("Peter Heins - 5456454", "5456454");
Then, you could do as you described and call
string value = "5456454";
ListItem valueToRemove = ddl.Items.FindByValue(valueToRemove);
dd1.Remove(valuetoRemove);
edit: If you absolutely cannot change the value (whether it be for school purposes or some other reason) I would do something like this.
string id = "5456454";
foreach (ListItem item in dd1.Items)
{
if (item.Text.Contains(id))
{
dd1.Items.Remove(item);
}
}
I use combobox in c# windows form. I bound the item list as below:
var employmentStatus = new BindingList<KeyValuePair<string, string>>();
employmentStatus.Add(new KeyValuePair<string, string>("0", "[Select Status]"));
employmentStatus.Add(new KeyValuePair<string, string>("1", "Contract"));
employmentStatus.Add(new KeyValuePair<string, string>("2", "Part Time"));
employmentStatus.Add(new KeyValuePair<string, string>("3", "Permanent"));
employmentStatus.Add(new KeyValuePair<string, string>("4", "Probation"));
employmentStatus.Add(new KeyValuePair<string, string>("5", "Other"));
cmbEmployeeStatus.DataSource = employmentStatus;
cmbEmployeeStatus.ValueMember = "Key";
cmbEmployeeStatus.DisplayMember = "Value";
cmbEmployeeStatus.SelectedIndex = 0;
I save the selected value in database eg.1 or 2. Now I want to set selected value from database item like:
cmbEmployeeStatus.SelectedValue =employee.employmentstatus;
But combobox not selected with value. How can I do that?
Try this one.
cmbEmployeeStatus.SelectedIndex = cmbEmployeeStatus.FindString(employee.employmentstatus);
In order to do the database style ComboBoxes manually trying to setup a relationship between a number (internal) and some text (visible), I've found you have to:
Store you items in a list (You are close - except the string,string - need int,string)
DataSource property to the list (You are good)
DataMember,DataValue (You are good)
Load default value (You are good)
Put in value from database (Your question)
Get value to put back in database (Your next question)
First things first. Change your KeyValuePair to so it looks like:
(0,"Select")
(1,"Option 1")
Now, when you run your sql "Select empstatus from employees where blah" and get back an integer, you need to set the combobox without wasting a bunch of time.
Simply: *** SelectedVALUE - not Item ****
cmbEmployeeStatus.SelectedValue = 3; //or
cmbEmployeeStatus.SelectedValue = intResultFromQuery;
This will work whether you have manually loaded the combobox with code values, as you did, or if you load the comboBox from a query.
If your foreign keys are integers, (which for what I do, they all are), life is easy. After the user makes the change to the comboBox, the value you will store in the database is SelectedValue. (Cast to int as needed.)
Here is my code to set the ComboBox to the value from the database:
if (t is DBInt) //Typical for ComboBox stuff
{
cb.SelectedValue = ((DBInt)t).value;
}
And to retrieve:
((DBInt)t).value = (int) cb.SelectedValue;
DBInt is a wrapper for an Integer, but this is part of my ORM that gives me manual control over databinding, and reduces code errors.
Why did I answer this so late? I was struggling with this also, as there seems to be no good info on the web about how to do this. I figured it out, and thought I'd be nice and post it for someone else to see.
In windows Appliation
we use like this
DDLChangeImpact.SelectedIndex = DDLChangeImpact.FindStringExact(ds.Tables[0].Rows[0]["tmchgimp"].ToString());
DDLRequestType.SelectedIndex = DDLRequestType.FindStringExact(ds.Tables[0].Rows[0]["rmtype"].ToString());
Use the SelectedIndex property for the respective employee status in the combo box.
Below will work in your case.
cmbEmployeeStatus.SelectedItem =employee.employmentstatus;
When you set the SelectedItem property to an object, the ComboBox attempts to make that object the currently selected one in the list. If the object is found in the list, it is displayed in the edit portion of the ComboBox and the SelectedIndex property is set to the corresponding index. If the object does not exist in the list, the SelectedIndex property is left at its current value.
EDIT
I think setting the Selected Item as below is incorrect in your case.
cmbEmployeeStatus.SelectedItem =**employee.employmentstatus**;
Like below
var toBeSet = new KeyValuePair<string, string>("1", "Contract");
cmbEmployeeStatus.SelectedItem = toBeSet;
You should assign the correct name value pair.
cmbEmployeeStatus.Text = "text"
I suspect something is not right when you are saving to the db. Do i understand your steps as:
populate and bind
user selects and item, hit and save.. then you save in the db
now if you select another item it won't select?
got more code, especially when saving? where in your code are initializing and populating the bindinglist
A possible solution:
cmbEmployeeStatus.SelectedValue = cmbEmployeeStatus.Items.FindByText("text").Value;
try this
combobox.SelectedIndex = BindingSource.Item(9) where "9 = colum name 9 from table"
To set value in the ComboBox
cmbEmployeeStatus.Text="Something";
Try this:
KeyValuePair<string, string> pair = (KeyValuePair<string,string>)this.ComboBox.SelectedItem;
I am retrieving the credit card type from Database and have to show what credit card type the merchant have used, in the dropdowm. The dropdown has 4 types like Master, Visa, American Express and Discover along with select.
I retrieve it well, but I am not sure how to bind it such that it has all the 4 types along with select but should show the creditcard that has been used.
if (cardtype == 1)
{
ddCreditCardType.SelectedValue = ((int)CommonHelper.CCType.Master).ToString();
}
((int)CommonHelper.CCType.Master).ToString();
//This part gets the type of card used but does not put in the ddCreditCardType.
Please help me out! Thank you!
it looks like your CCType is an enum.
here's what you want to do:
ddCreditCardType.SelectedValue = ((CommonHelper.CCType) cardtype ).ToString();
cardtype is an int, you cast it to your enum type CCType. then convert it to string which returns "Mastercard" or whatever instead of "1" as before. your dropdown probably had the name as its datatext and datavalue bc it didnt have it defined. you would want to set selected value to "1" if your dropdown.DataText = "CardTypeID" or something like that.
The ddCreditCardType.SelectedIndex allows you to set the index.
string TypeOfCard = "Mastercard"; // Replace with your retrieval code
ddCreditCardType.SelectedIndex = ddCreditCardType.Items.IndexOf("Mastercard");
Note that you really must provide error checking because you could get nulls...
Assuming you've just got constants for all the CC types, I'd probably just do something like:
var selectedCardId = ??;
//Make an array of all the card types (this can be a constant)
var cardTypes = new CommonHelper.CCType[]{CommonHelper.CCType.Master, CommonHelper.CCType.Visa, CommonHelper.CCType.Express, CommonHelper.CCType.Whatever};
//Loop through, and build the drop-down
foreach(var card in cardTypes)
{
ddCreditCardType.Items.Add(new ListItem
{
Value = ((int)card).ToString(),
Text = card.ToString(),
IsSelected = (selectedCardId == (int)card)
});
}
I'm sorry, it's been a while since I've done webforms (Or Winforms?)
You'll have to double-check the properties of the list-item thing's.
Good Luck,
Dave
When you build the dropdown, what is the Value in the dropdown. You can choose a text to display and the value behind each item. If your value is CommonHelper.CCType.Master), it should work.
I have a sorted list. When I bind it to a listbox, it does not shows the item in an ordered manner.
territoryListBox.BeginUpdate();
this.Text = ((INamedEntity)_currentList[0]).Name;
territoryListBox.DataSource = _currentList;
territoryListBox.DisplayMember = "Name";
territoryListBox.Sorted = true;
territoryListBox.EndUpdate();
The first item in the list is, say, A. The this.Text shows "A", which is the first item in the list. But the listbox shows:
B
C
A
_currentList is a IList<>
Are you swallowing an exception? When I try this I get (when setting Sorted) an ArgumentException:
Items collection cannot be modified when the DataSource property is set.
IMO, sort the list first - and bind to that; however, a quick test shows that setting Sorted before setting the DataSource works too - i.e.
territoryListBox.Sorted = true;
territoryListBox.DataSource = yourListOfData;
territoryListBox.DisplayMember = "Name";
Just for fun, try ListBox.Sort. Obviously, that should not be necessary, but something's going haywire.