0

私は他の人のコードに取り組んでいて、非常に興味深いものを見つけました。誰かがこれがどのように起こっているかを知っていることを願っています.

マークアップ ファイルに、TextBoxコントロールとDropDownListコントロールを配置し、両方に を割り当てて、背景色やその他のクールな要素を変更します CssClassInputField

疑問を避けるために、ここに私の宣言を示します。IDE からそのままコピーして貼り付けます。

<asp:TextBox runat="server" ID="txtCity" CssClass="InputField" />
<asp:DropDownList runat="server" ID="ddlState" CssClass="InputField" OnInit="ddlState_Init" OnLoad="ddlState_Load" />

ページを実行する<input>と、正しいクラス名を持つレンダリングが表示されます。
しかし、<select>にはクラス名dropdownがあり、プロジェクト内の別の .css ファイルでたまたま定義されており、もちろん私のものとはスタイルが異なります。

もう一度、ビューソースからの逐語的に:

<input name="ctl00$ctl00$BodyContentPlaceHolder$ContentPlaceHolder1$txtCity" type="text" id="ctl00_ctl00_BodyContentPlaceHolder_ContentPlaceHolder1_txtCity" class="InputField" />
<select name="ctl00$ctl00$BodyContentPlaceHolder$ContentPlaceHolder1$ddlState" id="ctl00_ctl00_BodyContentPlaceHolder_ContentPlaceHolder1_ddlState" class="dropdown"></select>

これがどのように発生するかを調べるために、次の各イベントに足を踏み入れました。

  • Page_Init
  • Page_Load
  • ddlStates_Init
  • ddlStates_Load

にウォッチを追加しましたddlStates.CssClass
驚いたことに、すべてのイベントで、 の値CssClassが既に に変更されていることがわかりましたdropdown

クラス名をそんなに早く変更するのは何ですか?
このようなオーバーライド値について私が知らないことはありますか?
何か値を変更したとしても、コントロールのInitイベント自体の前にそれを行うことができますか?

参考までに: ページ クラスはどのページ ベース クラスからも継承していませんSystem.Web.UI.Page

参考までに:ランダム属性を追加して正しいインスタンスを見ているddlStatesことを確認し、実行したすべてのイベント ステップ インでその情報が保持されていることを確認しました。

ありがとう。

4

1 に答える 1

2

深く掘り下げる前に、確認する必要があることがいくつかあります。私が最初に探すのは、スキン/テーマ ファイルです。これらのファイルは、コントロールの外観を上書きして一貫性を持たせますが、知らないと大混乱を招く可能性があります。これを確認するには、ページ ヘッダーを確認するか、スキン ファイルを探してください。

これは、スキン/テーマファイルに関する詳細情報のリンクです。

セクションテーマ設定の優先順位の下の上記のソースから:

ページの Theme プロパティを設定すると、テーマとページのコントロール設定がマージされて、コントロールの最終設定が形成されます。コントロール設定がコントロールとテーマの両方で定義されている場合、テーマのコントロール設定がコントロールのページ設定をオーバーライドします。この戦略により、ページ上のコントロールに既に個別のプロパティ設定がある場合でも、テーマはページ間で一貫した外観を作成できます。たとえば、以前のバージョンの ASP.NET で作成したページにテーマを適用できます。

または、ページの StyleSheetTheme プロパティを設定して、テーマをスタイル シート テーマとして適用することもできます。この場合、設定が両方の場所で定義されている場合、ローカル ページの設定がテーマで定義されている設定よりも優先されます。これは、カスケード スタイル シートで使用されるモデルです。全体的な外観にテーマを適用しながら、ページ上の個々のコントロールのプロパティを設定できるようにする場合は、テーマをスタイル シート テーマとして適用できます。

それが問題でない場合は、ドロップダウンの名前を一時的に変更して、プログラムで再生されないようにすることをお勧めします。それが失敗した場合、困難な方法でデバッグするという長く困難な旅が始まります。

于 2010-10-27T23:53:13.890 に答える