1

这部分参考了这一点:

为什么不从 GridView 的下拉列表中触发 SelectedIndexChanged 事件?

我认为它足够不同,可以问另一个问题。

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

我认为这更像是我如何创建 asp.net 2.0+ 控件,但我要问的可能吗?您能否制作一个“新”gridview 控件,它恰好总是有一个 ddl 并且只是(以某种方式)引用它而没有 findcontrol 和其他所有内容?

我意识到它将为一个独特的应用程序高度定制。我只是想看看是否有可能,因为我可能想用它来创建其他控件。

谢谢你。

4

1 回答 1

2

这取决于您对“新 GridView”的定义。答案仍然存在,但要付出代价。

如果您的控件基于 WebControl,您可以编写具有任何功能的新网格控件。不知何故,我不认为这是你的想法。

如果你想继承现有的 GridView 并添加额外的控件,那么它也是可行的,但有很大的限制。原因是因为 GridView 的实现打破了所有可能的可扩展性准则。我猜是因为他们从来没有打算延长它。例如,他们几乎在任何情况下都会清除 Controls 集合,并明确期望 Controls[0] 是一个表。我想,如果您决定保持在表格布局(页眉、页脚和所有内容)的范围内,那么您可能有更多的发挥空间。

最后,您可以创建一个包装器,它有一个 GridView 作为其私有成员,并简单地公开您可能需要的所有内容以及更多内容。但这很快就会变得丑陋。

这是第二种方法的粗略演示(工作)。请注意,下拉菜单位于末尾。您可以覆盖 Render 方法,但您必须重新创建大量 MS 代码。

扩展网格视图

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;
    }
}

一些页面.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();
}
于 2009-03-14T04:19:19.503 回答