ASP.NETでのDropDownListのサブクラス化
-
04-07-2019 - |
質問
ASP.NETに組み込まれたDropDownListをサブクラス化して、機能を追加してページで使用できるようにします。 UserControlでこれを試しましたが、内部DropDownListが公開されていないことがわかりました(論理的には推測します)。私は答えをグーグルで調べましたが、何も見つかりません。
実際のクラスを書くところまで来ました。DropDownListからサブクラス化することは可能ですが、ASP.NETページにファイルを登録してソースビューで使用することはできません。クラスにいくつかのプロパティがありませんか?
アイデアはありますか
解決
ユーザーコントロールではなく、カスタムコントロールでDropDownListを拡張します。
MyLibraryという新しいクラスライブラリプロジェクトを作成します。
MyDropDownList.csというクラスを追加します
namespace My.Namespace.Controls
{
[ToolboxData("<{0}:MyDropDownList runat=\"server\"></{0}:MyDropDownList>")]
public class MyDropDownList: DropDownList
{
// your custom code goes here
// e.g.
protected override void RenderContents(HtmlTextWriter writer)
{
//Your own render code
}
}
}
ライブラリをコンパイルしたら、Webアプリケーションでライブラリへの参照を追加できます。
そして、web.configのtagprefix
<add tagPrefix="my" namespace="My.Namespace.Controls" assembly="MyLibrary" />
これにより、これをaspx / ascxの
に追加できるようになります。<my:MyDropDownList ID="myDDl" runat="server">
...
</my:MyDropDownList>
他のヒント
コメントで、目標を明確にします:&quot;やりたいことは、DDLに常に存在する最初の値を定義するInitialValueプロパティを追加することだけです
特別なユーザーコントロールまたはカスタムコントロールを作成してそれを実現する必要はないと思います。
リストコントロールにデータを入力するために、Webアプリ全体でこのコードをよく使用します。追加のListItemをリストの上部に追加するかどうかを示すブール値と、そのアイテムのテキストを渡します。
public static void BindListControl (ListControl ctl, SqlDataReader dr,
String textColumn, String valueColumn, bool addBlankRow, string blankRowText)
{
ctl.Items.Clear();
ctl.DataSource = dr;
ctl.DataTextField = textColumn;
ctl.DataValueField = valueColumn;
ctl.DataBind();
if (addBlankRow == true) ctl.Items.Insert(0, blankRowText);
}
これは、たとえば、すべてのDropDownListに初期値として空白または「都市を選択」などのテキストを含める場合に便利です。