2009-10-29 4 views
3

ASP.NET 차트 컨트롤에 익숙한 경우 차트 개체에는 차트 할 수있는 일련의 데이터 개체 인 일련의 개체가 포함되어 있습니다. 각 시리즈는 동일한 차트에서 다른 방법 (막대 또는 점 또는 선)으로 시각화 할 수 있습니다.ASP.NET 차트 컨트롤 - 동적으로 데이터 포인트 시리즈 추가 및 제거

UI의 Series 목록을 만들고 제거하고 수정하는 데 사용하는 사용자 지정 컨트롤이 있습니다. 버튼을 클릭하면 해당 시리즈를 사용하여 차트가 만들어집니다. 그러나 (동일한 시리즈에서도) 차트를 다시 표시하려고하면 불어서 NullReferenceException을 발생시킵니다.

가 여기에 관련 코드입니다 - 내가 객체 포장 시리즈를 가지고 컨트롤 자체에서

public class DataSeries 
{ 
    private Series _series = new Series(); 
    ... (bunch of other properties) 
    public Series Series 
    { 
     get { return _series; } 
     set { _series = value; } 
    } 
} 

(I는 일부 사용자 지정이있는 특성을 가지고 있기 때문에), I는 속성으로 이들의 목록을 저장 (I 나는 목록을 유지하기를 원하기 때문에 전용) 비 포스트 백시 객체를 생성 :

private static List<DataSeries> seriesList; 

public List<DataSeries> ListOfSeries 
    { 
     get { return seriesList; } 
     set { seriesList = value; } 
    } 

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      seriesList = new List<DataSeries>(); 
     } 
    } 

그럼 내가 그 특성을, 새로운 DataSeries를 추가 제거하고 수정하는 데 사용할 수있는 컨트롤의 일부 아말감이있다. 그건 모두 작동합니다. 그것은 마치 마법처럼 작동

protected void refreshChart(object sender, EventArgs e) 
{ 
    chart.Series.Clear(); 

     foreach (DataSeries s in seriesControl.ListOfSeries) 
     { 
      string propertyName = s.YAxisProperty; 

      //List of data to display for this series 
      List<Sampled_Data> sampleList = Sample.GetSamplesById(s.ComponentId); 

      foreach (Sampled_Data dSample in sampleList) 
      { 
       //GetPropertyValue returns a float associated with the propertyname 
       //selected for displaying as the Y Value 
       s.Series.Points.AddY(BindingLib.GetPropertyValue(dSample, propertyName)); 
      } 
      chart.Series.Add(s.Series); 
     } 
    } 

나는 코드의 조각을 실행할 처음 :

가 페이지에 '차트 만들기'를 클릭

이 실행됩니다 코드입니다. 'refreshChart'를 실행하는 버튼을 두 번 클릭하면 's.Series.Points'의 값이 null이므로 NullReferenceException이 발생합니다. 그리고 Point 속성이있는 유형의 새 객체를 만들 수 없습니다. 생성자가 private이거나 protected입니다.

이 함수의 후속 호출간에 Points 속성을 조작하지 않으면 왜 null이되는 것입니까?

생각할 수있는 몇 가지 해결책이 있습니다. DataSeries가 시리즈 대신 상속 받도록 설정하면 오류가 계속 발생하면 Point 속성을 새로 추가 할 수 있습니다. 또한 ListOfSeries를 완전히 복사하여 문제가 해결되는지 확인할 수 있습니다. 아마 모든 내 사용자 지정 특성을 Series 개체로 밀어 넣을 수도 있습니다.이 속성에는 customfields 속성 (또는 비슷하게 이름이 지정된)이 있습니다. 다른 객체를 감싸는 객체를 전달하지 않으면이 문제가 해결 될 수 있습니다.

왜 이것이 발생하고 어떻게 해결 될 수 있는지에 대한 아이디어가 있으십니까?

답변

5

나는 100 % 확실하지 않다,하지만 난 라인이

chart.Series.Clear(); 

직접 seriesList이 라인

chart.Series.Add(s.Series); 

단지 참조를 전달 때문에 정적 멤버의 내부 Series를 지 웁니다 의심 그 자리에 Series이 그려져 있습니다.

나는 그 일이 일어나지 않아야한다고 생각한다 : 당신은 아마도 그 회원을 어딘가에서 채울 것이다.

당신은 게터 제거하여이 가정을 확인할 수 있습니다

: 당신이 새로 고칠 때

chart.Series.Clear(); 

에서 예외가 발생한다 그 순간의 코드를

set { seriesList = value; } 

을 : 차트는 취소 할 수 없습니다 정적 회원 seriesListSeries이 더 이상 존재하지 않습니다.

회원이 아닌 이유는 무엇입니까?

정적 멤버를 통해 시리즈의 전체 복사본을 제공하고 차트에 전달하면 this answer이 아니라면 작동하고, 불행하게도 Series은 [Serializable]로 표시되지 않습니다.

// Do you want to write this Property? copying all fields of Series Manually? 
chart.Series.Add(s.DeepCopyOfMySeries); 

행운을 비네!

관련 문제