See the question and my original answer on StackOverflow

I suggest you define a custom control in your project (and reference it instead of asp:DropDownList) derived from the standard DrowDownList that will not throw when the selection is not defined as an item in the list.

If should work as is (by default, the empty value item will be selected), but you can also define what you consider as the value or the text that represent the "not selected" item using one of its properties. Here is the class:

public class ExtendedDropDownList : System.Web.UI.WebControls.DropDownList
{
    protected override void PerformDataBinding(IEnumerable dataSource)
    {
        try
        {
            base.PerformDataBinding(dataSource);
        }
        catch (ArgumentOutOfRangeException)
        {
            ListItem item;

            // try the value we defined as the one that represents <no selection>
            if (NoSelectionValue != null)
            {
                item = Items.FindByValue(NoSelectionValue);
                if (item != null)
                {
                    item.Selected = true;
                    return;
                }
            }

            // try the text we defined as the one that represents <no selection>
            if (NoSelectionText != null)
            {
                item = Items.FindByText(NoSelectionText);
                if (item != null)
                {
                    item.Selected = true;
                    return;
                }
            }

            // try the empty value if it exists
            item = Items.FindByValue(string.Empty);
            if (item != null)
            {
                item.Selected = true;
                return;
            }
        }
    }

    [DefaultValue(null)]
    public string NoSelectionValue
    {
        get
        {
            return (string)ViewState[nameof(NoSelectionValue)];
        }
        set
        {
            ViewState[nameof(NoSelectionValue)] = value;
        }
    }

    [DefaultValue(null)]
    public string NoSelectionText
    {
        get
        {
            return (string)ViewState[nameof(NoSelectionText)];
        }
        set
        {
            ViewState[nameof(NoSelectionText)] = value;
        }
    }
}

}