2017-01-11 10 views
-1

実行時にスタックエリアチャートを作成したいとします。私はボタンをクリックするとデータポイントを追加したい。データテーブルに新しい行を追加中にエラーが発生する

ただし、 'この行はすでに別のテーブル'に属しています。

ここにはSimple Projectの完全なコードがあります。

DataRow drIBM, drMSN, drMCN; 
DataTable chartData = new DataTable(); 
Random r = new Random(); 
int count = 0; 

protected void Page_Load(object sender, EventArgs e) 
{ 
    chartData.Columns.Add("Series Label", typeof(string)); 

    for (int i = 0; i < 10; i++) 
    { 
     chartData.Columns.Add("DP_" + i.ToString(), typeof(int)); // Addind Datapoints as a Columns 
    } 

    drIBM = chartData.NewRow(); 
    drMSN = chartData.NewRow(); 
    drMCN = chartData.NewRow(); 

    drIBM["Series Label"] = "IBM"; 
    drMSN["Series Label"] = "MSN"; 
    drMCN["Series Label"] = "MCN"; 

    if (Session["chartData"] == null) 
    { 
     Session["chartData"] = chartData; 
    } 

} 

protected void Button1_Click(object sender, EventArgs e) 
{ 
    count++; 

    chartData = Session["chartData"] as DataTable; 

    drIBM[count] = r.Next(1, 10); // Datarow[Column Index] getting random number 
    drMSN[count] = r.Next(1, 10); 
    drMCN[count] = r.Next(1, 10); 

    chartData.Rows.Add(drIBM); // In this part I am getting above error. 
    chartData.Rows.Add(drMSN); 
    chartData.Rows.Add(drMCN); 

    Session["chartData"] = chartData; 
    UltraChart1.DataSource = Session["chartData"]; 
    UltraChart1.DataBind(); 
} 

答えて

0

私はDataRowクラスの内部の仕組みを持つ巨大に慣れていないんだけど、私はあなたがあなたとこのリファレンスを交換するButton1_Click()chartData.NewRow();

を呼び出すときに、それはchartDataへの参照を保持している推測しています1つはあなたのSessionオブジェクトに保持されているオブジェクトです。 chartDataと意味的には同じですが、DataRowはこれが別のオブジェクトだと考えて例外をスローします。

chartDataがクラス変数のように見えるので、どうしてあなたがSessionで気になるのかわかりません。次の行を削除して、これが機能するかどうかを確認してください。

chartData = Session["chartData"] as DataTable; 
0

行変数をグローバルに宣言しました。これらの変数の範囲をローカルに変更した場合、これらのDataRow変数の宣言を一番上から削除し、メソッドでそれらを再度宣言します(例:Page_LoadやButton_Click1などの特定のメソッドでDataRow drIBM、drMSN、drMCNを宣言してください) 。

関連する問題