如何通过将DateTime正确转换为Double,将DateTime锚定到ASP柱形图上的X坐标?

时间:2016-09-02 18:03:57

标签: c# asp.net datetime charts sqldatareader

我试图将DateTime对象锚定到ASP柱形图的X坐标,这样我可以在初始化图表时在列上显示线注释。我知道它需要是一个Double才能工作,我尝试使用DateTime.Now.ToOADate()以及ToDouble()和DateTime.Ticks属性,但它们都没有工作。

这是我的代码( MainForm.aspx.cs ):

    void getChartData()
    {
        String ConString = ConfigurationManager.ConnectionStrings["cs"].ConnectionString;
        using (SqlConnection connection = new SqlConnection(ConString))
        {
            String SQLText = "select AvailDate,MW from MWAvailability2 where UnitName = @UnitName and Station = @StationName and AvailDate between @AvailFrom and @AvailTo";
            SqlCommand cmd = new SqlCommand(SQLText, connection);
            connection.Open();
            cmd.Parameters.AddWithValue("@UnitName", ddUnit.SelectedValue);
            cmd.Parameters.AddWithValue("@StationName", ddStation.SelectedValue);
            if (TextBoxFrom.Text.Length > 0)
                {    
                    cmd.Parameters.AddWithValue("@AvailFrom", TextBoxFrom.Text);
                }
            else
                {    
                    cmd.Parameters.AddWithValue("@AvailFrom", "01-01-1900");
                }
            if (TextBoxTo.Text.Length > 0)
                {   
                    cmd.Parameters.AddWithValue("@AvailTo", TextBoxTo.Text);
                }
            else
                {
                    cmd.Parameters.AddWithValue("@AvailTo", "01-01-2050");
                }

            if (TextBoxFrom.Text.Length > 0 && TextBoxTo.Text.Length > 0)   // Text in from, text in to
            {
                chartTitle.Text = "Station " + ddStation.SelectedValue + " " + ddUnit.SelectedValue + " From: " + TextBoxFrom.Text + " To: " + TextBoxTo.Text;
            }
            else if (TextBoxFrom.Text.Length > 0 && TextBoxTo.Text.Length == 0)     // Text in from, no text in to
            {
                chartTitle.Text = "Station " + ddStation.SelectedValue + " " + ddUnit.SelectedValue + " From: " + TextBoxFrom.Text + " To: 01/01/2050";
            }
            else if (TextBoxFrom.Text.Length == 0 && TextBoxTo.Text.Length > 0)     // No text in from, text in to
            {
                chartTitle.Text = "Station " + ddStation.SelectedValue + " " + ddUnit.SelectedValue + " From: 01/01/1900 " + " To: " + TextBoxTo.Text;
            }
            else if (TextBoxFrom.Text.Length == 0 && TextBoxTo.Text.Length == 0)     // No text in from, no text in to
            {
                chartTitle.Text = "Station " + ddStation.SelectedValue + " " + ddUnit.SelectedValue + " From: 01/01/1900 To: 01/01/2050";
            }



            SqlDataReader reader = cmd.ExecuteReader();

            while (reader.Read())
            {
                Series series = ColumnChart.Series["Series1"];

                if (reader.HasRows)
                {

                   series.Points.AddXY(reader["AvailDate"].ToString(), reader["MW"]);

                    TextAnnotation ta = new TextAnnotation();

                    ta.AnchorX = Convert.ToDouble(reader["AvailDate"]); // problem
                    ta.AnchorY = Convert.ToDouble(reader["MW"]);

                    ta.Text = "Station A";
                    ColumnChart.Annotations.Add(ta);




                }
                else
                {
                    Console.WriteLine("No rows found.");
                }
            }

        }
    }

当应该将文本注释锚定到X坐标的行显示ta.AnchorX = Convert.ToDouble(reader["AvailDate"]);时,我收到一条错误消息,显示“从'DateTime'到'Double'的无效转换。”当我将其更改为ta.AnchorX = Convert.ToDouble(reader["AvailDate"].ToString());时,错误告诉我“输入字符串格式不正确”。

如果有帮助,这里是 HomePage.aspx.cs 的代码,其中执行此转换显然不那么复杂:

     void getChartData()
    {
        DataSet ds = new DataSet();
        // Read the data from XML file into DataSet
        ds.ReadXml(Server.MapPath("~/MWAvailability2.xml"));
        // Specify the column that contains values for X-AXIS
        ColumnChart.Series["Series1"].XValueMember = "AvailDate";
        // Specify the column that contains values for Y-AXIS
        ColumnChart.Series["Series1"].YValueMembers = "MW";
        // Annotations?
        TextAnnotation ta = new TextAnnotation();
        var xv = Convert.ToDouble("AvailDate");
        var yv = Convert.ToDouble("MW");

        ta.AnchorX = xv;
        ta.AnchorY = yv;

        ta.Text = "Station A";
        ColumnChart.Annotations.Add(ta);


        // Set DataSet as the DataSource for the Chart control
        ColumnChart.DataSource = ds;
        // Finally call DataBind
        ColumnChart.DataBind();
    }

我认为错误很可能与SQL阅读器对象有关,但我不确定。我在这里尝试过类似问题的其他解决方案,其中一些在上面列出,但它们似乎都不适用于我的情况。

我很乐意提供我可能遗漏的任何其他信息,这些信息可能有助于更好地解释我的情况。任何可以帮助我解决这个问题的建议或建议都会非常感激。提前致谢!

1 个答案:

答案 0 :(得分:1)

我将主要关注您的问题,并且它应该引导您朝着正确的方向......

ta.AnchorX = Convert.ToDouble(reader["AvailDate"]); // problem

这里的问题是您没有提供DateTime值。使用索引器时,SqlReader类始终提供对象,这意味着您实际上正在调用构造函数Convert.ToDouble(object)而不是Convert.ToDouble(DateTime)Convert类正在抑制编译器错误,因为方法调用匹配,但不是您期望的那个。您可以尝试直接使用AnchorX分配变量reader["AvailDate"]来确认这一点。它将告诉您强制转换是无效的,因为如果没有显式强制转换,对象不能存储在更多派生类型中。如果您将ToString()追加到reader(["AvailDate"])这会调用Convert.ToDouble(String),也是如此。如果存储在SQL数据库中的类型确实是DateDateTime的类型,那么您可以简单地指定一个类型。

试试这个:

ta.AnchorX = Convert.ToDouble((DateTime)reader["AvailDate"]); // solution?

<强>更新

@Quantic引起我的注意,仍然会抛出InvalidCastException,而仍然需要强制转换,因为我的原始假设是在运行时它会失败。不支持进一步检查MSDN Convert.ToDouble(DateTime)并且将失败:

  

返回值   键入:System.Double   不支持此转换。没有返回任何值。

https://msdn.microsoft.com/en-us/library/hfdd1sd9(v=vs.110).aspx

正确的电话确实是......

ta.AnchorX = ((DateTime)reader["AvailDate"]).ToOADate();