Pytanie MS Chart Control formatowanie osi


Używam MS Chart Control w aplikacji WinForm, którą piszę. Składnik osi X wykresu rozproszonego, który wyświetlam, to dane Int64, które ostatecznie reprezentują czas UTC. Chciałbym wziąć te dane Int64 i zasadniczo zrobić DataTime.FromFileTimeUTC (theTime) .ToString () na nim, aby pokazać znaczniki osi X użytkownika końcowego, które są znaczące.

Obecnie tworzę kolejną kolumnę w DataTable w pamięci, aby przechowywać ekwiwalent DateTime tego Int64 jak poniżej:

dataTable.Columns.Add("mytimestamp");
foreach (DataRow dr in dataTable.Rows)
{
   dr["mytimestamp"] = DateTime.FromFileTimeUTC(Convert.ToInt64(dr["theint64val"].ToString()));
}

A następnie używając kolumny "mytimestamp" jako wartości osi X. Działa to dobrze i mogę pokazać etykiety osi X jako wartości datetime.

Ale wolałbym nie kłopotać się tworzeniem kolumny i zasadniczo duplikować dane innych kolumn, ale nie widziałem żadnego sposobu na sformatowanie etykiet osi X. Myślę, że może tęskniłem za tym. Widziałem zdarzenie AxisViewChanged w dokumentacji i zobaczyłem, jak mogę ustawić tytuł wykresu z tymi danymi, ale nie same etykiety osi X.

Jakieś pomysły?


12
2017-10-20 13:59


pochodzenie


znalazłeś rozwiązanie? - NicoTek
@NicoTek: Podałem odpowiedź ... - digEmAll


Odpowiedzi:


Jestem bardzo późno, ale mam nadzieję, że to może być przydatne dla innych ludzi ...

Możliwym sposobem na to jest subskrybowanie chart.FormatNumber wydarzenie, np. :

void chart1_FormatNumber(object sender, FormatNumberEventArgs e)
{
    if (e.ElementType == ChartElementType.AxisLabels &&
        e.ValueType == ChartValueType.Int64)
    {
        e.LocalizedValue = DateTime.FromFileTimeUtc((long)e.Value).ToShortDateString();
    }
}

Ponieważ ta procedura obsługi zdarzenia jest wywoływana podczas konwersji kilku elementów wykresu, należy ją sformatować tylko żądaną oś, możesz przekazać niestandardowy format do etykiet osi:

this.chart1.ChartAreas[0].AxisX.LabelStyle.Format = "MyAxisXCustomFormat";

następnie dodaj kontrolę w module obsługi zdarzeń:

void chart1_FormatNumber(object sender, FormatNumberEventArgs e)
{
    if (e.ElementType == ChartElementType.AxisLabels &&
        e.ValueType == ChartValueType.Int64 && 
        e.Format == "MyAxisXCustomFormat")
    {
        e.LocalizedValue = DateTime.FromFileTimeUtc((long)e.Value).ToShortDateString();
    }
}

5
2018-03-04 17:31



Dzięki, @digEmAll, które pomogło! - BeemerGuy


Czy próbowałeś

 yourSeries.XValueType = ChartValueType.Time;

1
2018-02-17 12:27