5

私は自分のコードでこの例外を受け取っていて、誰かが私を助けてくれるかどうか疑問に思いました。

ObjectDataSourceにバインドされたリピーターコントロールがあり、リピーターのitemtemplateにはユーザーコントロール(ASCX)が含まれています。このユーザーコントロールには、他のいくつかのコントロール、主にObjectDataSourceに関連付けられているGridViewが含まれています。

この設定でコントロールを最初に使用すると、すべてがうまく機能します。データは正しく表示されます。ただし、フィルターオプション(リピーターの外側のドロップダウン)を変更してからリピーターを再バインドすると、例外が発生します。

ObjectDataSourceコントロール'expDataSource'には名前付けコンテナーがありません。DataBindを呼び出す前に、コントロールがページに追加されていることを確認してください。 "at System.Web.UI.WebControls.DataBoundControlHelper.FindControl(Control control、String controlID)... ...atSystem.Web.UI.WebControls.ObjectDataSource。 LoadCompleteEventHandler(オブジェクト送信者、EventArgs e)

問題が何であるかはわかりません-データソースをASCXコントロールの外に移動すると役立つ可能性があることをいくつかの場所で読んだことがあります-これは何もしません。objectdatasourceは適切に構造化されているように見え、私が言ったように、それは初めて(のみ)機能します。

LoadComplete()が発生した後にASP.NETがFindControl()を呼び出しているときにこれが発生しているという例外について、スタックトレースで気づきました。コードをステップスルーすると、これが発生する前にすべてのコードの実行が終了したように見えるため、すべて「システム」コードになります。

ASP.NETがLoadCompleteハンドラーでこのデータソースコントロールを見つけられないのはなぜですか?

ありがとう!

その他の注意事項:

  • このエラーは1回おきに発生します。したがって、最初にデータが正しく読み込まれると、2回目の更新でこのエラーが発生して失敗します。もう一度「ロード」をクリックすると、動作します(3回目)。

  • 失敗したときは、ASCXコントロールで「Page_Load」が2回呼び出されているようです。したがって、パターンは次のとおりです。

    1. 作業パターン:
  • 親ページのPage_Load
  • ASCXでのPage_Load
  • データは正常に読み込まれます

    1. 失敗パターン:
  • 親ページのPage_Load
  • ASCXでのPage_Load
  • ASCXでのPage_Load
  • 例外

これはすべて「Repeater.DataBind()」の呼び出しから発生しますが、すでにバインドされているかどうかによって(明らかに)動作が異なります。

その他の注意事項:

本当に奇妙な行動。ObjectDataSourceの下部からSelectParametersのリストを削除しましたが、突然、ページはObjectDataSourceをNamingContainerがないものとして拒否しません。もちろん、これらのパラメーターがないと、データバインディングは実際には機能しません...コードにそれらを追加できますが、なぜそれが重要なのでしょうか?

4

4 に答える 4

4

奇妙な解決策を見つけました。それを投稿します。これで修正された理由を理解するために話し合うことができます。

私のページでは、次の構造になっています(タグをいくらか言い換えます)。

ページ

DropDownFilter

リピータ

UserControl X

ObjectDataSource

DropDownFilterを参照するControlParameters

ObjectDataSourceを終了します

エンドUserControlX

エンドリピーター

終了ページ

ご覧のとおり、Repeater ItemTemplate内にはユーザーコントロールがあり、ユーザーコントロールにはControlParametersを含む「有罪」のObjectDataSourceがありました。これらのコントロールパラメーターには、参照される親ページのDropDownListフィルターの名前があります(したがって、基本的に、このコントロールが他のページに追加された場合、適切な名前のコントロールが見つからないと、もちろん失敗します)。

そのため、すべてのControlParametersをParametersに変更(そのDropDownListコントロールへの参照を削除)したときに、エラーが発生しなくなりました。

私が推測できるのは、このデータソースが親ページのコントロールを参照しているという事実は、DataBind()でページのコントロールセットに追加するのに問題があったことを意味しているということです。まったく失敗するとしたら、初めて失敗すると思っていたでしょうから、それでも謎です。

何かご意見は?

于 2009-11-17T14:51:31.510 に答える
2

これは、ASP.NETDataControlsの例外的なエラーです。私は同様の問題を抱えており、このエキセントリックなエラーの数か月後に失われましたが、最終的に解決策を得ました。その理由は; ItemTemplateにアイテムを表示するには、LayoutTemplateのサーバーコントロールを使用して、ItemTemplateのプレースホルダーとして機能する必要があります。たとえば、レイアウトテンプレートのIDプロパティでTable/Divコントロールを使用できます。実行時に、このプレースホルダーコントロールはItemTemplateの内容に置き換えられ、「コンテナーの名前付けエラー」は表示されなくなります。最後に、ItemTemplateにobjectDataSourceがある場合は、レイアウトテンプレートに「Id」プロパティを持つ何か(テーブル/ Divなど)を追加したことを確認してください。

ありがとう、スニル。

于 2010-06-27T07:43:03.700 に答える
1

レイは頭に釘を打ちました。あなたは間違いなくどこかに「if(!IsPostBack)」を見逃しています。リピーターにユーザーコントロールをどのように追加していますか?ダイナミックですか?あなたはそれがItemTemplateにあると言うので、おそらくそうではありません...しかし、Page_Loadへの複数の呼び出しは、コントロールの複数のコピーを意味します。

于 2009-11-16T22:28:59.630 に答える
1

両方のDataBindを使用します。例:

SqlDataSource1.DataBind();
ListView1.DataBind();
于 2011-09-12T20:32:26.380 に答える