Добавление GroupName к элементам в RadioButtonList - PullRequest
0 голосов
/ 06 сентября 2010

Я создал класс, который наследуется от RadioButtonList, чтобы добавить атрибут GroupName к каждому элементу списка. (почему его там уже не было, я понятия не имею).

Работает, как и ожидалось, при визуализации, но не сохраняет выбранные элементы при обратной передаче.

public class GroupedRadioButtonList : RadioButtonList
{
    [Bindable(true), Description("GroupName for all radio buttons in list.")]
    public string GroupName
    {
        get;
        set;
    }

    protected override void RenderItem(ListItemType itemType, int repeatIndex, RepeatInfo repeatInfo, System.Web.UI.HtmlTextWriter writer)
    {
        RadioButton radioButton = new RadioButton();
        radioButton.Page = this.Page;
        radioButton.GroupName = this.GroupName;
        radioButton.ID = this.ClientID + "_" + repeatIndex.ToString();
        radioButton.Text = this.Items[repeatIndex].Text;
        radioButton.Attributes["value"] = this.Items[repeatIndex].Value;
        radioButton.Checked = this.Items[repeatIndex].Selected;
        radioButton.TextAlign = this.TextAlign;
        radioButton.AutoPostBack = this.AutoPostBack;
        radioButton.TabIndex = this.TabIndex;
        radioButton.Enabled = this.Enabled;            
        radioButton.RenderControl(writer);

    }
}

Кто-нибудь знает, чего мне не хватает?

Спасибо.

1 Ответ

0 голосов
/ 06 сентября 2010

Вам необходимо реализовать интерфейс IPostBackDataHandler и обработать несколько методов. Я даю вам то, что использовал в аналогичном элементе управления, только я расширил отдельный элемент управления RadioButton, а не список. Я добавил пользовательские атрибуты Value и GroupName к кнопке, а затем инициализировал значение при обратной передаче.

#region IPostBackDataHandler Members
    void IPostBackDataHandler.RaisePostDataChangedEvent()
    {
        OnCheckedChanged(EventArgs.Empty);
    }

    bool IPostBackDataHandler.LoadPostData(string postDataKey, NameValueCollection postCollection)
    {
        bool result = false;
        //check if a radio button in this button's group was selected
        string value = postCollection[GroupName];
        if ((value != null) && (value == Value)) //was the current radio selected?
        {
            if (!Checked) //select it if not already so
            {
                Checked = true;
                result = true;
            }
        }
        else //nothing or other radio in the group was selected
        {
            if (Checked) //initialize the correct select state
            {
                Checked = false;
            }
        }
        return result;
    }
#endregion

Извините за не очень оптимизированный код:)

...