2

2つの異なるメソッド間で共有されるオブジェクトの配列が必要です。

私のウェブページのbutton1のonclickは、objectArrayに必要な値を設定するmethod1を呼び出します。method1が処理していたのと同じデータで同じobjectArrayにアクセスできるようにするには、button2のonclickメソッドが必要です。

using myWebReference;
{
public partial class _Default : System.Web.UI.Page
{        
    ObjectArray[] myObjects = new ObjectArray[100]; 

    public void Page_Load(object sender, EventArgs e)
    {   
        //I have nothing in here at the moment      
    }
    public void method1(object sender, EventArgs e)
    {
        //myObjects[]'s values are calculated and assigned here. 
    }
    public void method2(object sender, EventArgs e)
    {
        String key = myObjects[0].value;
        //when I try to get data within myObjects here, myObjects does exist, 
    //but it is empty and I get a null reference error when I try to use its values.
    }
}       
4

4 に答える 4

3

言語の問題ではありません。Webフォームにバインドされています。すべてのWebリクエストが終了すると、Webサーバー上のすべての状態が破棄されます。

したがって、Webリクエスト1で、method1を呼び出すと、配列がいっぱいになります。

Webリクエスト1の終了したhtmlがブラウザに返され、サーバー上の配列が破棄されます。

Webリクエスト2でmethod2が呼び出されますが、配列は行によってのみ初期化されます

ObjectArray[] myObjects = new ObjectArray[100]; 

したがって、他のデータは含まれていません。

「以前の」myObjects値に到達できるようにする場合は、それをどこかに保存する必要があります。たとえば、阿部が提案したSessionState、DB、ビューステート、Cookieなどです。

于 2012-10-09T23:49:16.513 に答える
1

@Peter Repacが言ったように、ViewStateを使用することもできます。このような:

//In method1.
ViewState["MyObjectsKey"] = myObjects;
....

//In method2.
myObjects = ViewState["MyObjectsKey"];

myObjectsViewStateはページとともに送信されるため、非常に大きくなる場合はこれを使用することに注意してください。そのため、サイズが大きくなるとパフォーマンスに影響を与える可能性があります。ViewStateの詳細については、こちらをご覧ください。

于 2012-10-10T00:02:33.730 に答える
0

最も簡単な方法は、配列をロードするメソッドを作成し、button1を押したときに呼び出す方法と、button2を押したときに呼び出す方法です。しかし、action2では、後でさらに多くのことを行います...

始めたばかりの場合は、ビューステートやセッションをいじり始めるのは良い考えではないと思います。悪い習慣が生まれる可能性があるからです。IMHOの最も簡単なアプローチは、アレイを2回ロードすることです。

別のメソッドを作成せずに、method2からmethod1を呼び出すこともできます。

于 2012-10-10T00:46:29.870 に答える
0

異なるポストバック間でデータを利用できるようにする場合は、各ポストバックで同じ方法でデータをロードするか、最初にロードされたデータをセッション状態(またはその他の許容可能な場所)に保存する必要があります。

ここでセッション状態を確認できます。セッション状態を使用する際の潜在的な落とし穴を必ず読んでください。

コードは次のようになります。

myObjects = LoadMyObjects();
Session["objects"] = myObjects;
于 2012-10-09T23:47:31.560 に答える