2

ツリービューを表す Web サーバー コントロールを作成します。したがって、展開/折りたたみには + と - の 2 つの画像を使用したいと考えています。ページにレンダリングするときに画像ソースとして使用できるように、これをコントロールに組み込むにはどうすればよいですか?

これはコンパイル済みの Web コントロール ライブラリにあるため、Web アプリケーションの外部画像に依存したくありません。

編集:Andre Kraemerによるこの回答
に基づいて、私は次のことを行いました:

AssemblyInfo.vb では:

<Assembly: System.Web.UI.WebResource("MyCompany.MyWebControls.Resources.plus.gif", "image/gif")> 
<Assembly: System.Web.UI.WebResource("MyCompany.MyWebControls.Resources.minus.gif", "image/gif")> 

私のRenderContentsオーバーライドでは:

Dim lPlusImage As New WebControls.Image()
Dim lMinusImage As New WebControls.Image()
lPlusImage.ImageUrl = Page.ClientScript.GetWebResourceUrl(Me.GetType(), "MyCompany.MyWebControls.Resources.plus.gif")
lMinusImage.ImageUrl = Page.ClientScript.GetWebResourceUrl(Me.GetType(), "MyCompany.MyWebControls.Resources.minus.gif")
lPlusImage.RenderControl(output)
lMinusImage.RenderControl(output)

私のアセンブリ名はMyWebControlsです。

私のルート名前空間はMyCompany.MyWebControls.

画像plus.gifと画像minus.gifは という名前のフォルダーResourcesにあり、画像のBuild ActionはEmbedded Resourceに設定されています。

それでもうまくいきません。エラーは発生しません。生成された画像の URL をブラウザーで直接試してみましたが、ボットは何も起こらず、空白のページだけです。

注:
リソース名に無効なパスを使用しようとしましたが、結果はまったく同じでした。実際のリソースをリソース名にマップするために何か特別なことをする必要があるのではないかと考えました。AssemblyInfo で指定されたものとは異なる名前をコードで使用した場合にのみ、404 Not Found エラーが発生しました。パスが実際のリソースを指していたこととは関係ありません。

編集:

私は解決策を見つけました!

C# と VB の違いであることがわかりました。この質問に対する私自身の回答を参照してください。

4

3 に答える 3

4

ツリービューコントロールプロジェクトの画像と呼ばれるサブフォルダに2つの画像を追加します。次に、プロパティグリッドでのビルドアクションをコンテンツから埋め込みリソースに変更します。

それに加えて、次のように、これら2つの画像をアセンブリの埋め込みリソースとしてassemblyinfo.csファイルに登録する必要があります。

[assembly: System.Web.UI.WebResource("YourProjectsNameSpace.Images.plus.gif", "img/gif")]
[assembly: System.Web.UI.WebResource("YourProjectsNameSpace.Images.minus.gif", "img/gif")]

これらの画像はコントロールアセンブリに埋め込まれるため、次のようにClientScriptManagerを使用して画像にアクセスできます。

string plusImageUrl  = Page.ClientScript.GetWebResourceUrl(this.GetType(), "YourProjectsNameSpace.Images.plus.gif");
string minusImageUrl  = Page.ClientScript.GetWebResourceUrl(this.GetType(), "YourProjectsNameSpace.Images.minus.gif");
于 2010-02-15T09:54:08.890 に答える
2

OK、この記事で答えを見つけました。Andre Kraemer が正しい方向に向けてくれたので、受け入れられた答えとして Andre Kraemer の功績を称えます。彼は、C# と VB の名前構造にわずかな違いがあることを知りませんでした。

VB で機能するソリューションは次のとおりです。

重要な違いは、VB ではファイル パスが名前に含まれていないことです。

私の例では、プロジェクトのルート名前空間はMyCompany.MyWebControlsで、画像ファイルは という名前のサブフォルダーにありますResources。C# では、サブフォルダーはリソース名構造の一部ですが、VB ではそうではありません。

C# では、次のようになります。

[assembly: System.Web.UI.WebResource("MyCompany.MyWebControls.Resources.plus.gif", "image/gif")]

VB では、リソース名パスのファイル パスを無視する必要があります。

<Assembly: System.Web.UI.WebResource("MyCompany.MyWebControls.plus.gif", "image/gif")> 

したがって、これがわかると、私の完全な例は次のようになります。

AssemblyInfo.vb で:

<Assembly: System.Web.UI.WebResource("MyCompany.MyWebControls.plus.gif", "image/gif")> 
<Assembly: System.Web.UI.WebResource("MyCompany.MyWebControls.minus.gif", "image/gif")> 

私のRenderContentsオーバーライドでは:

Dim lPlusImage As New WebControls.Image()
Dim lMinusImage As New WebControls.Image()
lPlusImage.ImageUrl = Page.ClientScript.GetWebResourceUrl(Me.GetType(), "MyCompany.MyWebControls.plus.gif")
lMinusImage.ImageUrl = Page.ClientScript.GetWebResourceUrl(Me.GetType(), "MyCompany.MyWebControls.minus.gif")
lPlusImage.RenderControl(output)
lMinusImage.RenderControl(output)

そしてほら、それはうまくいきます!

于 2010-03-11T10:56:53.073 に答える
1

イメージ -> プロパティ -> ビルド アクション -> 埋め込みリソース。コントロールまたはライブラリでコンパイルされます。

于 2010-02-15T09:46:52.847 に答える