1

我正在尝试在 C# 中创建一个 dotnet highcharts。如果您熟悉 dotnot highcharts,那么您就会知道数据源必须是一个对象。我的数据将来自 SQL Server。当我最初开始创建它时,我创建了一个类来将 SQL 数据加载到:

public class chartDataByGradeByGenderByRace
{
    public string locID { get; set; }
    public string name { get; set; }
    public decimal y { get; set; }
    public int tot { get; set; }
    public int code { get; set; }
    public chartDrillDown drilldown { get; set; }
}

public class chartDrillDown
{
    public string name { get; set; }
    public List<string> categories { get; set; }
    public List<decimal> data { get; set; }
    public List<int> totCat { get; set; }
}

我将数据加载到类中的函数:

    [WebMethod]
    public List<chartDataByGradeByGenderByRace> getChartDataByGradeByGender(string gender, int pageID)
    {
        formValues fv = new formValues();
        string personID = fv.personID;

        List<chartDataByGradeByGenderByRace> ls = new List<chartDataByGradeByGenderByRace>();
        object ao = new chartDataByGradeByGenderByRace();

        string mySQL = "exec get_referralPct_byGrade_byGender_byRace @personID, @pageID, @Gender";
        string cf = System.Configuration.ConfigurationManager.ConnectionStrings["DistrictAssessmentDWConnectionString"].ConnectionString;

        SqlConnection connection = new SqlConnection(cf);
        SqlCommand command = new SqlCommand(mySQL, connection);

        command.Parameters.AddWithValue("@personID", personID);
        command.Parameters.AddWithValue("@pageID", pageID);
        command.Parameters.AddWithValue("@Gender", gender);

        connection.Open();

        SqlDataReader dr = command.ExecuteReader();

        string name = null;
        chartDataByGradeByGenderByRace cd = new chartDataByGradeByGenderByRace();
        chartDrillDown cdd = new chartDrillDown();

        while (dr.Read())
        {
            if (name != dr["name"].ToString())
            {
                if (name != null)
                {
                    cd.drilldown = cdd;

                    ls.Add(cd);
                }

                cd = new chartDataByGradeByGenderByRace();
                cd.drilldown = new chartDrillDown();
                name = dr["name"].ToString();

                cd.y = Convert.ToDecimal(dr["y"]);
                cd.tot = Convert.ToInt32(dr["tot"]);
                cdd = new chartDrillDown();
                cdd.categories = new List<string>();
                cdd.data = new List<decimal>();
                cdd.totCat = new List<int>();
                cdd.name = dr["name"].ToString();
            }

            cdd.categories.Add(dr["categories"].ToString());
            cdd.data.Add(Convert.ToDecimal(dr["data"]));
            cdd.totCat.Add(Convert.ToInt32(dr["totCat"]));
        }

        connection.Close();

        cd.drilldown = cdd;
        ls.Add(cd);

        return ls;
    }

还有我构建 dotnet highcharts 的方法:

    protected void getGradeGenderChart()
    {
        refData rd = new refData();
        List<chartCategoriesGrade> cats = new List<chartCategoriesGrade>();
        List<chartDataByGradeByGenderByRace> male = new List<chartDataByGradeByGenderByRace>();
        List<chartDataByGradeByGenderByRace> female = new List<chartDataByGradeByGenderByRace>();

        string locID = schoolArea.Replace("%", "D") + schoolLevel.Replace("%", "L") + schoolID_alt.Replace("%", "S");
        string id = "refsGradeGender" + locID;

        cats = rd.getChartCategories_Grade(29, "html");
        male = rd.getChartDataByGradeByGender("Male", 29);
        female = rd.getChartDataByGradeByGender("Female", 29);

        string[] catObject = new string[cats.Count];
        int idx = 0;
        foreach (chartCategoriesGrade cat in cats)
        {
            catObject[idx++] = cat.grade;
        }

        DotNet.Highcharts.Highcharts chart = new DotNet.Highcharts.Highcharts(id)
            .InitChart(new Chart { DefaultSeriesType = ChartTypes.Column, Height = 225 })
            .SetTitle(new Title
            {
                Text = "Grade/Gender (Click columns to view Races)",
            })
            .SetYAxis(new YAxis
            {
                Title = new YAxisTitle { Text = "% of Referrals" },
                Labels = new YAxisLabels { Enabled = false },
                GridLineColor = System.Drawing.Color.Transparent
            })
            .SetXAxis(new XAxis { Categories = catObject })
            .SetPlotOptions(new PlotOptions
            {
                Column = new PlotOptionsColumn
                {
                    DataLabels = new PlotOptionsColumnDataLabels
                    {
                        Enabled = true,
                        Formatter = "function() { return this.y; }",
                        Style = "fontWeight: 'bold'"
                    }
                },
                Series = new PlotOptionsSeries
                {
                    Cursor = Cursors.Pointer,
                    Point = new PlotOptionsSeriesPoint
                    {
                        Events = new PlotOptionsSeriesPointEvents { Click = "function() { location.href = this.options.url; }" }
                    }
                }
            })
            .SetSeries(new[] {
                new Series { Name= "Males", Data = new Data(male.ToArray()) },
                new Series { Name = "Females", Data = new Data(female.ToArray()) }
            })
            .SetLegend(new Legend { 
                Align = HorizontalAligns.Left,
                Floating = true,
                Layout = Layouts.Vertical,
                Padding = 2,
                VerticalAlign = VerticalAligns.Top
                })
            .SetCredits(new Credits { Enabled = false });

        refsByGradeByGenderByRace.Text = chart.ToHtmlString();
    }

当我运行它时,我在最后一行代码中收到以下错误:Parameter count mismatch

我玩过,知道错误是由代码的 .SetSeries 部分引起的,使用了 male.ToArray() 函数。在使用此方法之前,我已经创建了 dotnet highcharts,但在这些情况下,被转换的类没有子类。我不知道问题是否在于使用 ToArray() 没有将子类转换为对象或什么。

如我所见,我有两个选择:1) 只需在开始时将 SQL 数据加载到 Object 数组中,然后将其传递过来;或者 2) 将类转换为多维对象并在 .Set Series 部分中使用它。不幸的是,我不知道该怎么做。我读过的所有示例都只处理非常简单的数组,但我没有找到任何内容显示如何创建具有不同值的数组、如何为这些值创建名称、如何执行多维部分等等。

如果有人能教我如何在这个上钓鱼,我会非常非常感激:(

4

0 回答 0