Сохранить выбранный элемент в пользовательском элементе управления ASP.Net - PullRequest
0 голосов
/ 02 июня 2011

Я создал следующий пользовательский элемент управления и установил выбранное значение при нажатии элемента списка маркеров.

Моя проблема в том, что мне нужно установить класс css (SetSelected ()) после обратной передачи, но он всегда выбирает предыдущую запись в состоянии просмотра, а не собирает новое значение.

Не думаю, что мне следует использовать PageLoad для установки класса CSS, но я не уверен, где это лучше всего сделать.

Может кто-нибудь помочь, пожалуйста?

[DefaultProperty("SelectedValue"),
ToolboxData("<{0}:GlossaryList runat=\"server\" />")]
public class GlossaryList : WebControl
{
    const string MANAGEDMETADATASERVICE = "Managed Metadata Service";
    const string TOYOTA = "Toyota";

    BulletedList _bulletList = new BulletedList();

    public String SelectedText
    {
        get
        {
            object selectedText = ViewState["SelectedText"];
            return (selectedText == null) ? String.Empty : (string)selectedText;
        }
        set
        {
            ViewState["SelectedText"] = value;
        }
    }

    public String SelectedValue
    {
        get
        {
            object selectedValue = ViewState["SelectedValue"];
            return (selectedValue == null) ? String.Empty : (string)selectedValue;
        }
        set
        {
            ViewState["SelectedValue"] = value;
        }
    }

    protected override void OnInit(EventArgs e)
    {
        CreateBulletedList();    

        base.OnInit(e);
    }

    protected override void OnLoad(EventArgs e)
    {
        if (this.Page.IsPostBack)
        {
            SetSelected();
        }

        base.OnLoad(e);
    }

    private void SetSelected()
    {
        //if(this.Controls != null && this.Controls.Count > 0)
        //{
        //    foreach (ListItem listItem in ((BulletedList)this.Controls[0]).Items)
        //    {
        //        if (listItem.Value == SelectedValue)
        //        {
        //            listItem.Attributes.Add("class", "active");
        //        }
        //    }
        //}
    }

    protected void CreateBulletedList()
    {
        _bulletList.Click += new BulletedListEventHandler(BulletListItem_Click);
        _bulletList.DisplayMode = BulletedListDisplayMode.LinkButton;
        _bulletList.CssClass = "letter-selector";

        for (char c = 'A'; c <= 'Z'; c++)
        {
            ListItem listItem = new ListItem();

            listItem.Text = c.ToString();
            listItem.Value = c.ToString();

            if (SelectedValue == c.ToString())
            {
                listItem.Attributes.Add("class", "active");
            }

            _bulletList.Items.Add(listItem);
        }

        if (!this.Page.IsPostBack)
        {
            _bulletList.Items[0].Selected = true;
            _bulletList.Items[0].Attributes.Add("class", "active");
        }

        this.Controls.Add(_bulletList);
    }

    private void BulletListItem_Click(object sender, BulletedListEventArgs e)
    {
        SelectedValue = SelectedText = _bulletList.Items[e.Index].Value;

        SetActive(e.Index);
    }

    private void SetActive(int index)
    {
        if (this.Controls != null && ((BulletedList)this.Controls[0]).Items.Count > 0)
        {
            foreach (ListItem listItem in ((BulletedList)this.Controls[0]).Items)
            {
                listItem.Attributes.Clear();
            }
        }

        ((BulletedList)this.Controls[0]).Items[index].Attributes.Add("class", "active");
    }
}

1 Ответ

1 голос
/ 02 июня 2011

Добавьте следующий код:

protected override void CreateChildControls()
{
    Controls.Clear();
    CreateBulletedList();
}

public override ControlCollection Controls
{
    get
    {
        EnsureChildControls();
        return base.Controls;
    }
}


protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
    EnsureChildControls();
}

Изменить метод SetSelected:

private void SetSelected()
{
        foreach (ListItem listItem in _bulletList.Items)
        {
            if (listItem.Value == SelectedValue)
            {
                listItem.Attributes.Add("class", "active");
            }
        }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...