- - PR -
カスタムコントロールデザイン時と実行時の判定につきまして
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2005-02-15 15:08
毎々大変お世話になっております。
現在、TextBoxを元にしてカスタムコントロールを作成しています。 ===================実現したいこと=================== ・実行時に作成DLLと同階層に存在する設定ファイルより 設定値を読み込みコントロールの初期値としたい。 かつデザイン時にもほぼ同様のロジックで処理を完結させたい。 [Designer("Hsl.WebControls.UICustomTextBoxDesigner,AAA.WebControls")] public class CustomTextBox: WebControl, IEbbaWebControl, INamingContainer { public CustomTextBox() { } protected Hashtable FileRead(string elementname,string ctlname) { XmlDocument doc = new XmlDocument(); Assembly asm; asm = Assembly.GetExecutingAssembly(); xmlFilePath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); //現在のコードを実行しているアセンブリのパスのみを取得する xmlFilePath += @"\\" + XMLFILENAME; doc.Load(xmlFilePath ); ↑実行時と、デザイン時ではSystem.Reflection.Assembly.GetExecutingAssembly().Locationで 取得されるパスが異なるため、エラーとなる。 設定ファイルは一括管理したいため、デザイン時と実行時の 判定が行いたい。 } } ==================================================== 現在、コーディングでは実行時には同階層に存在するXMLファイルを 正常にローディングできます。 しかし、デザイン時には、System.Reflection.Assembly.GetExecutingAssembly().Locationで取得される ファイルパスが実行時と異なるため、デザイン画面上コントロールのエラーが発生 してしまいます。 デザイン時と実行時を判定できれば、 問題は解決できるのですが、1コントロールの作成クラスであるため System.Web.UI.Pageを継承できず、this.site.designmodeを 参照することができません。 上記現象の、解決方法をご存知の方がいらっしゃいましたら、 ご教授の程、宜しくお願い致します。 | ||||
|
投稿日時: 2005-02-15 15:22
当方では (Site != null && Site.DesignMode) で判断しています
http://www.dotnet247.com/247reference/msgs/18/92861.aspx | ||||
|
投稿日時: 2005-02-15 16:29
todoさん、ご教授ありがとうございます。
題記の件、 >当方では (Site != null && Site.DesignMode) で判断しています >http://www.dotnet247.com/247reference/msgs/18/92861.aspx を参考にさせて頂き、私なりに現環境と実現方法を 考えましたので、ご報告させて頂きます。 コントロール作成クラスではthis.Siteは実行時も デザイン時もnullになってしまうため、 >(Site != null && Site.DesignMode) は判断できませんでした。 (単に私が未熟なため、うまく値が入ってくれませんでした) よって下記方法での実現方法を考えました。 LicenseManager.CurrentContext.UsageMode == LicenseUsageMode.Runtime 実行時はRuntimeがデザイン時はDesigntimeが 値として取得できました。 以上、大変勉強になりました。 またご教授の程、宜しくお願い致します。 | ||||
|
投稿日時: 2005-02-15 16:31
たなすぺさん、こんにちは。
が何を意味するのかは判りませんが、System.Web.UI.WebControls.WebControl の継承クラスであれば、System.Web.UI.Page クラスと同様、 System.ComponentModel.IComponent.Site プロパティを実装しているはずですけど…。 ところで、本件とは関係ありませんが、 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=18428&forum=7 とか http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=18276&forum=7 とか http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=18126&forum=7 とか、解決してるんでしょうか…。 | ||||
|
投稿日時: 2005-02-15 16:44
きくちゃんさん、お世話になっております。
下記の件、ご連絡が遅くなり申し訳ございません。 1.http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=18428&forum=7 2.http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=18276&forum=7 上記に関しましてはまだ、実現方法が分からず、なんとも言えない状態に なってきました。 3.http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=18126&forum=7 に関しましては、DropDownListを継承したクラスを作り、 下記方法で実現できました。 ================================================================================== override protected void RenderContents(HtmlTextWriter writer) { StringWriter sw = new StringWriter(); HtmlTextWriter tw = new HtmlTextWriter(sw); for(int i=0;i<this._DropDownList.Items.Count;i++) { ListItem li = this._DropDownList.Items[i]; //<Option writer.WriteBeginTag(System.Web.UI.HtmlTextWriterTag.Option.ToString()); if(li.Selected) // selected = true writer.WriteAttribute(System.Web.UI.HtmlTextWriterAttribute.Selected.ToString(),System.Web.UI.HtmlTextWriterAttribute.Selected.ToString(),false); writer.WriteAttribute(System.Web.UI.HtmlTextWriterAttribute.Value.ToString(), li.Value, true); IEnumerator d = this._DropDownList.Items[i].Attributes.Keys.GetEnumerator(); while(d.MoveNext()) writer.WriteAttribute(d.Current.ToString(),this._DropDownList.Items[i].Attributes[d.Current.ToString()]); if (i % 2 == 0){ // CLASS = "" writer.WriteAttribute(System.Web.UI.HtmlTextWriterAttribute.Class.ToString(),"OptionStyle0"); } else{ // CLASS = "" writer.WriteAttribute(System.Web.UI.HtmlTextWriterAttribute.Class.ToString(),"OptionStyle1"); } // /> writer.Write(HtmlTextWriter.TagRightChar); System.Web.HttpUtility.HtmlEncode(li.Text,writer); writer.WriteEndTag(System.Web.UI.HtmlTextWriterTag.Option.ToString()); writer.WriteLine(); } } ================================================================================== ご連絡が遅れまして誠に申し訳ございませんでした。 | ||||
1
