这部分是为了参考:
Why isn't the SelectedIndexChanged event firing from a dropdownlist in a GridView?
我认为另外一个问题就不同了。
我的想法是,不是将下拉列表(ddl)添加到gridview,然后使用上面的技术,我可以创建一个全新的控件,其中包含ddl并直接引用它。
这更像是我如何创建asp.net 2.0+控件,我想,但这是我要问的可能吗?你可以制作一个“新的”gridview控件,它恰好总是有一个ddl并且只是在没有findcontrol和其他所有的情况下引用它(不知何故)吗?
我意识到它会针对一个独特的应用程序进行高度自定义。我只是想看看是否可能,因为我可能想用它来创建其他控件。
谢谢。
答案 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();
}