0

aspx ページの上部に Cookie クラム (リンク ボタン) を動的に作成します。ユーザーがこのページの他のボタンをクリックすると、パンくずが読み込まれます。各クラムにはハイパーリンクがあり、ユーザーはそれをクリックしてクラムが参照するセクションに戻ることができます。ユーザーが owner.aspx ページでクラムを更新するボタンをクリックするたびに、パブリック変数を設定し、クラムを設定するサブ内の変数を参照します。ページの読み込み時にポストバックごとにこのサブルーチンを呼び出します。

また、owner.aspx に people.ascx コントロールがあり、ユーザーが people.ascx のボタンをクリックすると、owner.aspx の Cookie クラムを更新/設定したいと考えています。

これを行うには、people.ascx から owner.aspx でイベントを発生させようとしています。

  1. people.ascx のボタンの onclick サブで、次のイベントを発生させます。 RaiseEvent UpdateOwnerCookieCrumbs("2A") // この例では、変数 "2A" を渡していることに注意してください。
  2. people.ascx の先頭で、次のようにイベントを宣言します。 Public Event UpdateOwnerLandingPeopleCrumbs(PeopleCrumbID As String)
  3. owner.aspx の先頭で、次を使用して people.ascx から渡す変数を宣言します。 Public Property PeopleCrumbID As String
  4. owner.aspx のページ読み込みで、イベントを呼び出すハンドラーを追加します: AddHandler ucPeople_e.UpdateOwnerLandingPeopleCrumbs, AddressOf Me.BuildCrumbs

問題の核心は、人から所有者への変数の受け渡しにあります。

owner.aspx の BuildCrumbs サブは、すべてが owner.aspx のプレースホルダーに追加される Cookie クラムを動的に構築する場所です。

次のようなコードでボタンを作成します。

mybtn2.ID = "btnOwnerPeopleEmployees_Crumb"
mybtn2.ToolTip = "Manage my business employees"
mybtn2.Text = "Employees"
AddHandler mybtn2.Click, AddressOf OwnerLandingPeopleRedir
CookieCrumbs.Controls.Add(mybtn2)

上記のボタン ビルドの OwnerLandingPeopleRedir はサブです。したがって、owner.aspx で cookie crumb ボタンがクリックされた場合、OwnerLandingPeopleRedir サブルーチンを呼び出す必要があります。

問題?

owner.aspx で Cookie クラムを構築する要求が people.ascx から発生すると、owner.aspx のページ読み込みが発生します。ページの読み込みは、people.ascx から渡された PeopleCrumbID 変数の値を知らずに buildcrumbs サブルーチンを呼び出します (1 回目)。次に、owner.aspx のイベント ハンドラーが発生し、buildcrumbs サブルーチンが再度呼び出され (2 回目)、今度は PeopleCrumbID 変数が認識されます。コードのステップ実行はすべて良さそうです。ただし、ポストバック後に owner.aspx の cookie crumb ボタンをクリックすると、ボタンのハイパーリンクは OwnerLandingPeopleRedir サブを呼び出しません。そのため、コードが buildcrumbs を介して 2 回目に実行されると、ハイパーリンクが失われます。

ページの初期化イベントと他のすべてのイベントから BuildCrumbs Sub を呼び出して、ページのライフサイクルの早い段階でクラムを構築することが役立つかどうかを確認してみましたが、違いはありませんでした。

また、raiseevent で渡すのではなく、peoplecrumb のセッション変数を設定するようにコードを変更しようとしましたが、それもうまくいきませんでした。この場合、私が見つけたのは、ボタンを 2 回クリックすると、Cookie クラムが正常に構築されるということです...プログラミングは最初のパスで古いセッション変数の値を記憶し、それを正常に適用してクラムを構築します...grrrr。

私がこのこぶを乗り越えるのを助ける方法を知っている人はいますか? お願いします!:)

4

1 に答える 1

0

あなたがしていることがあなたの問題を引き起こしているのがわかると思います。念のために言っておきますが、カスタム コントロール (.ascx) を構築し、それをプレースホルダー コントロールに追加して Web フォームに動的に追加しています。ただし、ユーザーがカスタム コントロールを操作すると、イベントは親に発生しません。

ここで良いスタートを切ったと思いますが、これにアプローチするための少し異なる方法についてお勧めしたいと思います。また、コードが少しクリーンアップされ、1 ページの有効期間内にコントロールを 2 回ビルドする必要がなくなる場合もあります。

まず、「BuildCrumbs」サブを次のように変更します (プロジェクトの詳細に合わせて、「Dim mybtn2」行を変更する必要がある場合があります)。

Private Sub BuildCrumbs(IsNewControl As Boolean)
    Dim mybtn2 As People = LoadControl("~/controls/people.ascx")

    mybtn2.ID = "btnOwnerPeopleEmployees_Crumb"

    If IsNewControl Then
        mybtn2.ToolTip = "Manage my business employees"
        mybtn2.Text = "Employees"
    End If

    AddHandler mybtn2.Click, AddressOf OwnerLandingPeopleRedir
    CookieCrumbs.Controls.Add(mybtn2)
End Sub

次に、BuildCrumbs を呼び出している Page_Load 内のコードを削除し、代わりにプレースホルダーの init イベントに配置します。

Private Sub CookieCrumbs_Init(sender As Object, e As EventArgs) Handles CookieCrumbs.Init
    BuildCrumbs(Not Page.IsPostBack)
End Sub

動的コントロールが機能する方法では、最初にフォームに追加するときに、ID、ToolTip、および Text プロパティの設定など、それに関するすべてを作成する必要があります。ただし、ポストバックでは、ID プロパティ セットを使用してコントロールを作成し、それをページの同じ場所に追加するだけで、ページの ViewState 処理によって適切な値がコントロールに再設定されます。

さらに説明が必要な場合に提供できるサンプル プロジェクトがあります。

于 2013-09-10T20:54:55.450 に答える