1

これは部分的にこれに関連しています:

GridView のドロップダウンリストから SelectedIndexChanged イベントが発生しないのはなぜですか?

別の質問をするのに十分なほど違うと思いました。

私の考えでは、ドロップダウンリスト (ddl) をグリッドビューに追加してから上記の手法を使用する代わりに、ddl を含む新しいコントロールを作成し、それを直接参照することができます。

これは、asp.net 2.0+ コントロールを作成する方法のほうが多いと思いますが、私が求めていることは可能ですか? たまたま常に ddl が含まれている "新しい" gridview コントロールを作成し、findcontrol などを使用せずに (何らかの方法で) 参照することはできますか?

独自のアプリ向けに高度にカスタマイズされていることを認識しています。これを使用して他のコントロールを作成したいので、それが可能かどうかを確認しようとしています。

ありがとうございました。

4

1 に答える 1

2

これは、「新しいGridView」の定義によって異なります。答えはまだですが、コストがかかります。

コントロールをWebControlに基づいている場合は、任意の機能を備えた新しいグリッドコントロールを作成できます。どういうわけか、これはあなたが考えていることではないと思います。

既存のGridViewから継承して追加のコントロールを追加する場合は、それも実行可能ですが、大きな制限があります。その理由は、GridViewの実装が拡張性に関するすべての可能なガイドラインに違反しているためです。彼らはそれが拡張されることを決して意味しなかったので、私は推測します。たとえば、ほとんどすべての場合にControlsコレクションをクリアし、Controls[0]がテーブルであることを明示的に期待します。テーブルレイアウト(ヘッダー、フッターなど)の範囲内にとどまることにした場合は、プレイする余地が増える可能性があります。

最後に、プライベートメンバーとしてGridViewを持つラッパーを作成し、必要なものすべてに加えてさらに多くのものを公開することができます。しかし、それはすぐに醜くなります。

これは、2番目のアプローチの大まかなデモンストレーション(作業)です。ドロップダウンが最後にあることに注意してください。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();
}
于 2009-03-14T04:19:19.503 に答える