- PR -

ユーザーコントロールの値を取得し、WebFormに設定する

投稿者投稿内容
う〜にん
会議室デビュー日: 2005/01/02
投稿数: 19
投稿日時: 2005-01-04 18:26
<環境>
Windows XP
ASP.NET(VB)
で開発しています。
経験1ヶ月のど素人です。
どうぞよろしくお願いします。

<フォームの構成>
WEBフォーム
ユーザーコントロール(1つ)、テキストボックス(1つ)
ユーザーコントロール(WEBフォームにはりつけるユーザーコントロール)
ボタン(1つ)、テキストボックス(1つ)

ユーザーコントロール上のボタンクリックした時
ユーザーコントロール上のテキストボックスの値を
WEBフォーム上のテキストボックスに設定したいのです。

でもうまくできません。
どうぞお力をお借りできないでしょうか?

(イベントは拾えています。)

ユーザーコントロール側
Public Event btnClicked(ByVal sender As System.Object, ByVal e As System.EventArgs)

WEBフォーム側
Protected UC2 As New WebUserControl2

Private Sub btn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn.Click
RaiseEvent btnClicked(Me, System.EventArgs.Empty)
End Sub

Page_Loadで
AddHandler UC2.btnClicked, AddressOf Me.Search_clicked

Private Sub Search_clicked(ByVal sender As Object, ByVal e As System.EventArgs)
Dim myControl1 As Control = FindControl("TextBox1")
TextBox1.Text = ここにユーザーコントロール上テキストボックスの値
End Sub

こんな感じでやりたいと思っているのですが、
どうやってユーザーコントロールの値を取得すれば良いかわかりません。

どうぞ宜しくお願いします。




たつごろー
ぬし
会議室デビュー日: 2004/10/25
投稿数: 496
投稿日時: 2005-01-04 18:45
引用:

ASP.NET(VB)
WEBフォーム上のテキストボックスに設定したいのです。
どうやってユーザーコントロールの値を取得すれば良いかわかりません。



.NET Framework 開発者ガイド
ポストバック データ処理のサンプル
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconpostbackdataprocessingsample.asp

にサンプルがありますよ。

詳しくは
.NET Framework 開発者ガイド
ポストバック データの処理
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconreceivingpostbackdatachangednotifications.asp

.NET Framework 開発者ガイド
ASP.NET サーバー コントロールの開発
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconDevelopingWebFormsControls.asp

うまくいかなかったら、また書き込んでみてください。

_________________
たつごろー
codeseek
こみゅぷらす
う〜にん
会議室デビュー日: 2005/01/02
投稿数: 19
投稿日時: 2005-01-05 13:09
引用:

.NET Framework 開発者ガイド
ポストバック データ処理のサンプル
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconpostbackdataprocessingsample.asp
にサンプルがありますよ。



段階を踏んでURLを指定して頂きありがとうございます。

そして試してみたのですが、エラーが出てしまいました。
これを自力で解決できませんでした。

<エラー>
解析エラー メッセージ: ファイルまたはアセンブリ名 CustomControls、またはその依存関係の 1 つが見つかりませんでした。
アセンブリ読み込みトレース: 以下の情報は、アセンブリ 'CustomControls' を読み込めなかった原因を調べるのに役立ちます。

なので、折角教えて頂きましたのにまだ実現出来ていないのです。
ただ、Sourceをはって、実行するだけではだめだったのでしょうか?
質問以前の問いで大変申し訳ないのですが、ご教授頂けますか?

それから、
Public Property Text() As String
・・・

を使用する事は思いつきもしなかったので大変ためになりました。
”ポストバックデータ処理”についても。
ありがとうございます。

引き続きTRYします。
mso
ぬし
会議室デビュー日: 2003/12/04
投稿数: 496
お住まい・勤務地: 宮城
投稿日時: 2005-01-05 13:28
msoです。

引用:

う〜にんさんの書き込み (2005-01-05 13:09) より:
引用:

.NET Framework 開発者ガイド
ポストバック データ処理のサンプル
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconpostbackdataprocessingsample.asp
にサンプルがありますよ。



段階を踏んでURLを指定して頂きありがとうございます。

そして試してみたのですが、エラーが出てしまいました。
これを自力で解決できませんでした。

<エラー>
解析エラー メッセージ: ファイルまたはアセンブリ名 CustomControls、またはその依存関係の 1 つが見つかりませんでした。
アセンブリ読み込みトレース: 以下の情報は、アセンブリ 'CustomControls' を読み込めなかった原因を調べるのに役立ちます。

なので、折角教えて頂きましたのにまだ実現出来ていないのです。
ただ、Sourceをはって、実行するだけではだめだったのでしょうか?
質問以前の問いで大変申し訳ないのですが、ご教授頂けますか?




とりあえずリビルドしてもだめですか?
たつごろー
ぬし
会議室デビュー日: 2004/10/25
投稿数: 496
投稿日時: 2005-01-05 13:34
引用:

解析エラー メッセージ: ファイルまたはアセンブリ名 CustomControls、またはその依存関係の 1 つが見つかりませんでした。
ただ、Sourceをはって、実行するだけではだめだったのでしょうか?
TRYします。



http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconreceivingpostbackdatachangednotifications.asp


クライアントからポストバックされたフォーム データをコントロールで確認できるようにするには、そのコントロールに System.Web.UI.IPostBackDataHandler インターフェイスを実装する必要があります。

とあります。
これを把握しないと実装できないです。
初めてだとちょっと判りづらいところで、苦労するかもしれません。
この文書を追っかけてみて、わからなかったらご質問ください。

_________________
たつごろー
codeseek
こみゅぷらす
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-01-05 13:38
ユーザコントロール内のコントロールを操作したいだけなら、ユーザコントロールのプロパティを増やせばいいのではないでしょうか。
元のユーザコントロールに
コード:
Public Property Text As String
  Get
    Return 「ユーザコントロール内のテキストボックス」.Text
  End Get
End Property


を加えてみましょう。
う〜にん
会議室デビュー日: 2005/01/02
投稿数: 19
投稿日時: 2005-01-05 14:24
こんなに助けて頂いて有り難く思っています。

msoさん
ビルドはOKです。

たつごろーさん
にしざきさん
すみません。
まだそこまで達する事ができていません。

手順としては
教えて頂いたMSのサイトのコードで実現させてから自分の
環境に実装しようとしています。

以降にコードを示します。(MSのサンプルをそのままはっただけなのですが・・・)

<VB側>
Option Explicit On
Option Strict On

Imports System
Imports System.Web
Imports System.Web.UI
Imports System.Collections.Specialized

Namespace CustomControls
Public Class MyTextBox
Inherits Control
Implements IPostBackDataHandler

Public Property Text() As String
Get
Return CType(ViewState("Text"), String)
End Get
Set(ByVal Value As String)
ViewState("Text") = Value
End Set
End Property

Public Event TextChanged As EventHandler

Public Overridable Function LoadPostData(ByVal postDataKey As String, ByVal values As NameValueCollection) As Boolean Implements IPostBackDataHandler.LoadPostData
Dim presentValue As String = Text
Dim postedValue As String = values(postDataKey)
If Not presentValue.Equals(postedValue) Then
Text = postedValue
Return True
End If
Return False
End Function

Public Overridable Sub RaisePostDataChangedEvent() Implements IPostBackDataHandler.RaisePostDataChangedEvent
OnTextChanged(EventArgs.Empty)
End Sub


Protected Overridable Sub OnTextChanged(ByVal e As EventArgs)
RaiseEvent TextChanged(Me, e)
End Sub

Protected Overrides Sub Render(ByVal output As HtmlTextWriter)
output.AddAttribute(HtmlTextWriterAttribute.Type, "text")
output.AddAttribute(HtmlTextWriterAttribute.Value, Me.Text)
output.AddAttribute(HtmlTextWriterAttribute.Name, Me.UniqueID)
output.RenderBeginTag(HtmlTextWriterTag.Input)
output.RenderEndTag()
End Sub
End Class
End Namespace

Public Class MyTextBox
Inherits System.Web.UI.Page

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' ページを初期化するユーザー コードをここに挿入します。
End Sub

End Class

<デザイン側>
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="MyTextBox.aspx.vb" Inherits="WebApplication1.MyTextBox"%>
<%@ Register TagPrefix="Custom" Namespace="CustomControls" Assembly = "CustomControls" %>
<html>
<script language="VB" runat=server>
Private message As New StringBuilder("")

Private Sub Text_Changed(sender As Object, e As EventArgs)
message.Append(("The text in" & sender.ToString() & " was changed."))
message.Append(("<br>You entered " & Server.HtmlEncode(Box.Text) & "."))
End Sub

Protected Overrides Sub Render(output As HtmlTextWriter)
MyBase.Render(output)
output.Write(message.ToString())
End Sub
</script>

<body>

<form method="POST" action="MyTextBox.aspx" runat=server>
The text box below is an instance of a custom text box.<br>
It raises a text changed event when the text in the text box changes.<br><br>
Enter your name: <Custom:MyTextBox Text=" " OnTextChanged = "Text_Changed" id = "Box" runat=server/>
<br><br>
<asp:Button Text = "Submit" runat = server/>
</form>
</body>
</html>

これで全てです。
これが動いてくれないのです。

たつごろーさんのご指摘のところは
 Implements IPostBackDataHandler
だと思っているのですが、認識違いをしていますか?
たつごろー
ぬし
会議室デビュー日: 2004/10/25
投稿数: 496
投稿日時: 2005-01-05 14:31
引用:

これが動いてくれないのです。



これが動かないというのは、このエラーがでてるということ?

引用:

<エラー>
解析エラー メッセージ: ファイルまたはアセンブリ名 CustomControls、またはその依存関係の 1 つが見つかりませんでした。
アセンブリ読み込みトレース: 以下の情報は、アセンブリ 'CustomControls' を読み込めなかった原因を調べるのに役立ちます。



ASP.NETのWebフォーム側で出てるんじゃないかな。
別のプロジェクトのWebフォームにこのコントロールを埋め込めるか試してみてはいかが。

_________________
たつごろー
codeseek
こみゅぷらす

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