我试图将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阅读器对象有关,但我不确定。我在这里尝试过类似问题的其他解决方案,其中一些在上面列出,但它们似乎都不适用于我的情况。
我很乐意提供我可能遗漏的任何其他信息,这些信息可能有助于更好地解释我的情况。任何可以帮助我解决这个问题的建议或建议都会非常感激。提前致谢!
答案 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数据库中的类型确实是Date
或DateTime
的类型,那么您可以简单地指定一个类型。
试试这个:
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();