Можно ли сделать gridview с выпадающим списком в качестве одного нового элемента управления? - PullRequest
1 голос
/ 13 марта 2009

Это частично относится к этому:

Почему не происходит событие SelectedIndexChanged из выпадающего списка в GridView?

Я думал, что это достаточно по-другому, чтобы задать другой вопрос.

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

Это больше похоже на то, как я могу создать элементы управления asp.net 2.0+, я думаю, но возможно ли то, что я спрашиваю? Можете ли вы создать «новый» элемент управления gridview, в котором всегда присутствует ddl, и просто ссылаться на него (как-то) без findcontrol и всего остального?

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

Спасибо.

1 Ответ

2 голосов
/ 14 марта 2009

Это зависит от вашего определения «нового GridView». Ответ пока, но за плату.

Если вы основываете свой элемент управления на WebControl, вы можете написать новый элемент управления сеткой с любой функциональностью. Почему-то я не думаю, что это то, что ты имеешь в виду.

Если вы хотите унаследовать от существующего GridView и добавить дополнительные элементы управления, то это также выполнимо, но с серьезными ограничениями. Причина в том, что реализация GridView нарушает все возможные рекомендации по расширяемости. Я думаю, потому что они никогда не хотели, чтобы это было расширено. Например, они очищают коллекцию Controls почти в каждом случае и явно ожидают, что Controls [0] будет таблицей. Полагаю, если вы решите не выходить за рамки таблицы (верхний и нижний колонтитулы и все такое), то у вас может быть больше места для игры.

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

Вот грубая демонстрация (работа) второго подхода. Обратите внимание, что раскрывающийся список находится в конце. Вы можете переопределить метод Render, но вам придется воссоздать много кода MS.

ExtendedGridView

public class ExtendedGridView : GridView
{
    protected DropDownList DropDown { get; set; }

    public ExtendedGridView() : base()
    {
        this.DropDown = new DropDownList();
        this.DropDown.Items.Add("white");
        this.DropDown.Items.Add("red");
        this.DropDown.Items.Add("blue");
        this.DropDown.Items.Add("green");
        this.DropDown.AutoPostBack = true;
        this.DropDown.ID = "dropdown";
        this.DropDown.SelectedIndexChanged += new EventHandler(DropDown_SelectedIndexChanged);
    }

    void DropDown_SelectedIndexChanged(object sender, EventArgs e)
    {
        BackColor = System.Drawing.Color.FromName(this.DropDown.SelectedValue);
    }

    protected override int CreateChildControls(System.Collections.IEnumerable dataSource, bool dataBinding)
    {
        int itemCount = base.CreateChildControls(dataSource, dataBinding);
        Controls.Add(this.DropDown);
        return itemCount;
    }
}

SomePage.aspx

<%@ Register TagPrefix="my" Namespace="MyProject" Assembly="MyProject" %>
<my:ExtendedGridView id="myGridView" runat="server" onpageindexchanging="myGridView_PageIndexChanging"></my:ExtendedGridView>

SomePage.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
    myGridView.DataSource = new string[] { "aaa", "bbb", "ccc", "ddd", "eee" };
    myGridView.AllowPaging = true;
    myGridView.PageSize = 2;
    myGridView.DataBind();
}

protected void myGridView_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
    myGridView.PageIndex = e.NewPageIndex;
    myGridView.DataBind();
}
...