2013-06-14 5 views
0

У меня есть простой объект источника данных, в виде IENumerable<MyClass> где MyClass является:DataBind ObjectDataSource с несколькими Y-значения для MSChart

class MyClass(){ 
    public DateTime Key; 
    public Int Value1; 
    public Int Value2; 
    public Int Value3; 
} 

Я хочу, чтобы привязка его с помощью ObjectDataSource во время разработки, а не декларативно , я бы ожидать, что это будет:

<asp:Chart runat="server" DataSourceID="datasource"> 
    <Series> 
     <asp:Series XValueMember="Key" YValueMembers="Value1"/> 
     <asp:Series XValueMember="Key" YValueMembers="Value2"/> 
    </Series> 
</asp:Chart> 
<asp:ObjectDataSource ID="datasource" runat="server" SelectMethod="DataObjectMethodName" TypeName="DataObjectClassName"/> 

Но всякий раз, когда я пытаюсь привязка этого отображения я получаю следующее исключение:

Series data points do not support values of MyClass only values of these types can be used: Double, Decimal, Single, int, long, uint, ulong, String, DateTime, short, ushort.

Я также попытался позволить вернуть мой Datasource Dictionary<DateTime, Int[]> и Dictionary<DateTime, MyClass> , безуспешно.

Простой дизайн-привязка времени к сложным объектам, не поддерживаемым для MSCharts? Я смог привязать к Dictionary<DateTime, int>. В конце концов, это должна быть диаграмма типа StackedColumn.

У меня есть похожие вопросы, такие как Multiple columns chart using asp.net chart control, которые не отвечают на этот вопрос.

ответ

0

Эти вопросы, похоже, не так популярны на SO.

Мне не удалось достичь реальных привязок данных. Чтобы иметь возможность продолжать использовать конструктор, я просто использовал хак. Я добавил одну конструкцию к дизайнеру, поэтому я мог бы использовать редактор перетаскивания, уменьшая мою жизнь. Я скопировал значения из серии «шаблон».

 

    //Treat the one designer series as a template 
    var template = chartFares.Series.First(); 
    //Just used for fancying up the designer and adding demo settings 
    chartFares.Series.Clear(); 

    foreach (var series in serieses) 
    { 
     var chartSeries = chartFares.Series.Add(series.Name); 

     //Copy setting from template (better cloning mechanism would also be useful) 
     chartSeries.ChartType = template.ChartType; 
     chartSeries.ToolTip = template.ToolTip; 
     chartSeries.PostBackValue = template.PostBackValue; 

     foreach (var points in series.Data) 
     { 
      chartSeries.Points.AddXY(points.Period, points.Count); 
     } 
    }