- PR -

カスタムコントロールデザイン時と実行時の判定につきまして

1
投稿者投稿内容
たなすぺ
常連さん
会議室デビュー日: 2003/06/23
投稿数: 35
投稿日時: 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を
参照することができません。

上記現象の、解決方法をご存知の方がいらっしゃいましたら、
ご教授の程、宜しくお願い致します。
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2005-02-15 15:22
当方では (Site != null && Site.DesignMode) で判断しています

http://www.dotnet247.com/247reference/msgs/18/92861.aspx
たなすぺ
常連さん
会議室デビュー日: 2003/06/23
投稿数: 35
投稿日時: 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が
値として取得できました。

以上、大変勉強になりました。
またご教授の程、宜しくお願い致します。

きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2005-02-15 16:31
たなすぺさん、こんにちは。

引用:

1コントロールの作成クラスであるため


が何を意味するのかは判りませんが、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
とか、解決してるんでしょうか…。
たなすぺ
常連さん
会議室デビュー日: 2003/06/23
投稿数: 35
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)