是否可以将带有下拉列表的gridview作为一个新控件?

时间:2009-03-13 16:51:15

标签: asp.net controls custom-controls

这部分是为了参考:

Why isn't the SelectedIndexChanged event firing from a dropdownlist in a GridView?

我认为另外一个问题就不同了。

我的想法是,不是将下拉列表(ddl)添加到gridview,然后使用上面的技术,我可以创建一个全新的控件,其中包含ddl并直接引用它。

这更像是我如何创建asp.net 2.0+控件,我想,但这是我要问的可能吗?你可以制作一个“新的”gridview控件,它恰好总是有一个ddl并且只是在没有findcontrol和其他所有的情况下引用它(不知何故)吗?

我意识到它会针对一个独特的应用程序进行高度自定义。我只是想看看是否可能,因为我可能想用它来创建其他控件。

谢谢。

1 个答案:

答案 0 :(得分:2)

这取决于您对“新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();
}