SPFieldChoice and SPFieldMultiChoice are two type of SharePoint Choice field. The first one is single selection and displayed as dropdown menu or the radio buttons; the latter is multiple selections and displayed as a list of check boxes. To populate the choice items in a custom webpart, we can simply go through the Choices collection in the choice field:
// Populate Dropdown by SharePoint Choices (single selection from dropdown menu or radio buttons)
private void PopulateSPChoiceDropDown(DropDownList dropdown, SPList list, string fieldName)
{
if (dropdown == null || list == null || list.ItemCount == 0)
return;
dropdown.Items.Clear();
if (list != null && list.Fields.ContainsField(fieldName))
{
SPFieldChoice spChoices = list.Fields[fieldName] as SPFieldChoice;
if (spChoices != null && spChoices.Choices != null)
{
for (int i = 0; i < spChoices.Choices.Count; i++)
{
dropdown.Items.Add(new ListItem(spChoices.Choices[i], spChoices.Choices[i]));
}
}
}
}
// Populate CheckBoxList by SharePoint Choices (muliple selction)
private void PopulateSPChoiceCheckBoxList(CheckBoxList checkboxList, SPList list, string fieldName)
{
if (checkboxList == null || list == null || list.ItemCount == 0)
return;
checkboxList.Items.Clear();
if (list != null && list.Fields.ContainsField(fieldName))
{
SPFieldMultiChoice spChoices = list.Fields[fieldName] as SPFieldMultiChoice;
if (spChoices != null && spChoices.Choices != null)
{
for (int i = 0; i < spChoices.Choices.Count; i++)
{
checkboxList.Items.Add(new ListItem(spChoices.Choices[i], spChoices.Choices[i]));
}
}
}
}
As a matter of fact, we can merge above two methods into one:
// Populate List Control such as Dropdown and CheckBoxList by SharePoint Choices
private void PopulateSPChoiceToListControl(ListControl listControl, SPList list, string fieldName)
{
if (listControl == null || list == null || list.ItemCount == 0)
return;
listControl.Items.Clear();
if (list != null && list.Fields.ContainsField(fieldName))
{
SPFieldMultiChoice spChoices = list.Fields[fieldName] as SPFieldMultiChoice;
if (spChoices != null && spChoices.Choices != null)
{
for (int i = 0; i < spChoices.Choices.Count; i++)
{
listControl.Items.Add(new ListItem(spChoices.Choices[i], spChoices.Choices[i]));
}
}
}
}
The reason we can merge them together is because SPFieldChoice is inherited from SPFieldMultiChoice, and both DropDownList and CheckBoxList are implementation of abstract ListControl class. To update the SPField:
SPFieldMultiChoiceValue values = new SPFieldMultiChoiceValue();
foreach (ListItem listItem in checkList.Items)
{
if (listItem.Selected)
{
values.Add(listItem.Value);
}
}
item["MultipleChoiceField"] = values;
item["SingleChoiceField"] = dropdown.SelectedValue;
item.Update();