WPF Pie Chart how to add space between slices? - c#

I am using Telerik (RadPieChart) with WPF. How can I add space between the slices ?
This is what I currently have:
And this is how I want my Pie chart to look like with the spaces between the slices:
Here is my source code:
private DoughnutSeries CreateDognutSerie(KeyValuePair<ChartSerie, List<ChartDataPoint>> chartSerie, int index, int count)
{
double spaceBetweenSperies = 0.0;
if (count > 1 && index != count - 1)
{
spaceBetweenSperies = 0.007;
}
var doughnutSerie = new DoughnutSeries()
{
ShowLabels = true,
//LabelConnectorsSettings = new ChartSeriesLabelConnectorsSettings()
//{
//},
InnerRadiusFactor = index / (double)count,
RadiusFactor = ((index + 1) / (double)count) - spaceBetweenSperies,
//LegendSettings = new DataPointLegendSettings()
//{
//},
//SeriesAnimation = new PieChartAngleRangeAnimation()
//{
// InitialStartAngle = -90,
// InitialSweepAngle = 180,
// Duration = new TimeSpan(0, 0, 0, 0, 800),
//}
};
foreach (ChartDataPoint serie in chartSerie.Value)
{
doughnutSerie.DataPoints.Add(new PieDataPoint()
{
Label = serie.XPoint.Label,
Value = Math.Abs((double?)serie.Value ?? 0),
});
}
return doughnutSerie;
}

Use the OffsetFromCenter property in PieDataPoint. Something like OffsetFromCenter = 0.015 should be similar to the above image.
public MainWindow()
{
InitializeComponent();
var data = new Dictionary<string, double>
{
{ "January", 5 },
{ "February", 3 },
{ "March", 5 },
{ "April", 7 },
{ "May", 2 },
{ "June", 11 },
{ "July", 11 },
{ "August", 11 },
{ "September", 11 },
{ "October", 11 },
{ "November", 11 },
{ "December", 12 },
};
var series = CreateDougnutSeries(data);
var pie = new RadPieChart { Palette = ChartPalettes.Fluent };
pie.Series.Add(series);
mainGrid.Children.Add(pie);
}
private DoughnutSeries CreateDougnutSeries(Dictionary<string, double> data)
{
var doughnutSeries = new DoughnutSeries
{
ShowLabels = true,
InnerRadiusFactor = 0,
RadiusFactor = 1
};
foreach (var point in data)
{
doughnutSeries.DataPoints.Add(new PieDataPoint()
{
Label = point.Key,
Value = point.Value,
OffsetFromCenter = 0.015
});
}
return doughnutSeries;
}
Increasing OffsetFromCenter to say 0.1 will render thicker lines:

Related

How to fill picker with a list

I am updating older code but part of it must stay the same. I have now picker that needs to be filled with list.
My list
public List<TimeoutBetweenSentences> FillTimoutOptions()
{
var newListTimeoutBetweenSentenceses = new List<TimeoutBetweenSentences>()
{
new TimeoutBetweenSentences()
{
Position = 0,
Text = "+ 0 sekund",
Value = 0
},
new TimeoutBetweenSentences()
{
Position = 1,
Text = "+ 1 sekunda",
Value = 1
},
new TimeoutBetweenSentences()
{
Position = 2,
Text = "+ 2 sekundy",
Value = 2
},
new TimeoutBetweenSentences()
{
Position = 3,
Text = "+ 3 sekundy",
Value = 3
},
new TimeoutBetweenSentences()
{
Position = 4,
Text = "+ 4 sekundy",
Value = 4
},
new TimeoutBetweenSentences()
{
Position = 5,
Text = "+ 5 sekund",
Value = 5
},
};
return newListTimeoutBetweenSentenceses;
}
List<TimeoutBetweenSentences> allOptions = FillTimoutOptions();
sentencePausesStepper.Items.Add(allOptions.Select(m => m.Text).ToList().ToString());
however this displays just as "System collections" DO zou have any idea?
this is adding an entire list as ONE element
sentencePausesStepper.Items.Add(allOptions.Select(m => m.Text).ToList().ToString());
to add elements of one list to another, use AddRange instead
sentencePausesStepper.Items.AddRange(allOptions.Select(m => m.Text).ToList().ToString());
or better, do this
sentencePausesStepper.ItemsSource = allOptions;
sentencePausesStepper.ItemDisplayBinding = new Binding("Text");

dotnet highchart error, not showing data

i just curious on how to get the specific data column based on database
string[] arrLabel = new string[dt.Rows.Count];
Object[] data = new Object[dt.Rows.Count];
Object[] dataDetail = new Object[dt.Rows.Count];
String[] detail = new String[dt.Rows.Count];
var returnObject = new List<object>();
var returnColumnList = new List<object>();
int i = 0;
foreach (DataRow item in dt.Rows)
{
for (int j = 0; j < 1; j++)
{
returnColumnList.Add(new object[] {item["ATT_WF_STATUS_2"], item["ATT_WF_STATUS_3"]});
}
dataDetail = returnColumnList.ToArray();
returnObject.Add(new object[] { item["DEPARTEMENT"],dataDetail[i]});
arrLabel[i] = ((string)item["DEPARTEMENT"]);
i++;
}
data = returnObject.ToArray();
this.data = data;
this.arrLabel = arrLabel;
however, the graphic using dotnet is not showing but like this.
when i inspect element using browser
$(document).ready(function() {
chartColumnDetail = new Highcharts.Chart({
chart: { renderTo:'chartColumnDetail_container', options3d: { alpha: 10, beta: 0, depth: 50, enabled: true, viewDistance: 25 }, plotShadow: false, type: 'column' },
credits: { enabled: false },
legend: { enabled: true, itemStyle: { color: '#2C3E50' } },
plotOptions: { column: { allowPointSelect: true, colorByPoint: true, cursor: 'pointer', dataLabels: { enabled: true, style: { font:'14px', fontWeight:'bold' } }, depth: 50, showInLegend: true } },
subtitle: { text: 'Grouped by Status' },
title: { text: 'Attendance Analytics From 01 January 2010 Until 15 December 2016' },
tooltip: { formatter: function(){ var sliceIndex =this.point.index; var sliceName = this.series.chart.axes[0].categories[sliceIndex]; return 'The value for <b>' + this.point.name + '</b> is <b>' + this.y +'</b>';} },
xAxis: { categories: ['DO-Advisory Department', 'EDP Department', 'Enterprise Infrastructure Services Department', 'Pre Sales Department', 'Sales Department 1', 'IO-DCOPS Department', 'Human Capital Department'], labels: { align: 'center', style: { font: 'bold 10px Verdana,sans-serif' } } },
yAxis: { min: 0, title: { text: 'Amount' } },
exporting: { buttons: { contextButton: { align: 'center', x: 350, y: -3 } }, enabled: true, scale: 5 },
series: [{ data: [['DO-Advisory Department', [15, 32]], ['EDP Department', [26, 5]], ['Enterprise Infrastructure Services Department', [8, 1]], ['Pre Sales Department',[ 1, 6]], ['Sales Department 1', [1, 3]], ['IO-DCOPS Department',[ 1, 0]], ['Human Capital Department',[1, 0]], name: 'Department' }]
});
});
is there any way to fix this problem ? thank you very much
Update :
i am taking this from sql database which has this similar conditionenter image description here
Another update:
this is full coding for this case
protected DataTable GetDataDetail()
{
SortedList sl = new SortedList();
DateTime dateFrom = DateTime.ParseExact(Request.Form[txtOldDate.UniqueID], "yyyy-MM-dd", null);
DateTime dateTo = DateTime.ParseExact(Request.Form[txtNewDate.UniqueID], "yyyy-MM-dd", null);
sl.Add("#DATE_FROM-date", dateFrom);
sl.Add("#DATE_TO-date", dateTo);
DataTable dt = new DataTable();
dateFromChart = dateFrom.ToString("dd MMMM yyyy", CultureInfo.InvariantCulture);
dateToChart = dateTo.ToString("dd MMMM yyyy", CultureInfo.InvariantCulture);
dt = bll.GetAttendanceAnalyticsBasedWfStatus(sl);
string[] arrLabel = new string[dt.Rows.Count];
Object[] data = new Object[dt.Rows.Count];
Object[] dataDetail = new Object[dt.Rows.Count];
var returnObject = new List<object>();
List<object[]> returnColumnList = new List<object[]>();
int i = 0;
foreach (DataRow item in dt.Rows)
{
for (int j = 0; j < 1; j++)
{
returnColumnList.Add(new object[] { item["DEPARTEMENT"], item["ATT_WF_STATUS_2"], item["ATT_WF_STATUS_3"] });
}
dataDetail = returnColumnList.ToArray();
returnObject.Add(new object[] { returnColumnList.Select(b => new { name = b.GetValue(0), data = returnColumnList.Select(y => y.GetValue(1) + "," + y.GetValue(2)).ToArray() }).ToArray() });
arrLabel[i] = ((string)item["DEPARTEMENT"]);
i++;
}
jsonSeries = new JavaScriptSerializer().Serialize(returnObject);
Response.Write(jsonSeries);
data = returnObject.ToArray();
this.data = data;
this.arrLabel = arrLabel;
return dt;
}
then the dotnetchart
protected void ColumnChartDetail()
{
GetDataDetail();
//Binding data to Chart
DotNet.Highcharts.Highcharts chartColumnDetail = new DotNet.Highcharts.Highcharts("chartColumnDetail").InitChart(new Chart
{
DefaultSeriesType = ChartTypes.Column
})
.SetOptions(new GlobalOptions
{
Colors = new[] {
ColorTranslator.FromHtml("#50B432"), //using system.drawing
ColorTranslator.FromHtml("#ED561B"),
ColorTranslator.FromHtml("#DDDF00"),
ColorTranslator.FromHtml("#24CBE5"),
ColorTranslator.FromHtml("#64E572"),
ColorTranslator.FromHtml("#FF9655"),
ColorTranslator.FromHtml("#34495E"),
ColorTranslator.FromHtml("#6AF9C4")
}
})
//set title
.SetTitle(new Title
{
Text = "Attendance Analytics From " + this.dateFromChart + " Until " + this.dateToChart,
})
//set subtitle
.SetSubtitle(new Subtitle
{
Text = "Grouped by Status",
})
//set tooltip
.SetTooltip(new Tooltip
{
Formatter = #"function(){ var sliceIndex = this.point.index; var sliceName = this.series.chart.axes[0].categories[sliceIndex]; return 'The value for <b>' + this.point.name + '</b> is <b>' + this.y +'</b>';}"
})
//Exporting options
.SetExporting(new Exporting
{
Enabled = true,
Scale = 5,
Buttons = new ExportingButtons
{
ContextButton = new ExportingButtonsContextButton
{
Align = HorizontalAligns.Center,
X = 350,
Y = -3
}
}
})
//set plot option
.SetPlotOptions(new PlotOptions
{
Column = new PlotOptionsColumn
{
AllowPointSelect = true,
Depth = 50,
DataLabels = new PlotOptionsColumnDataLabels
{
Enabled = true,
Style = "font:'14px', fontWeight:'bold'"
},
ShowInLegend = true,
ColorByPoint = true,
Cursor = Cursors.Pointer,
}
})
//set chart initial
.InitChart(new Chart
{
Type = ChartTypes.Column,
PlotBackgroundColor = null,
PlotBorderWidth = null,
PlotShadow = false,
Options3d = new ChartOptions3d // options for 3D
{
Enabled = true,
Alpha = 10,
Beta = 0,
Depth = 50,
ViewDistance = 25
}
})
//set xAxis formatter text
.SetXAxis(new XAxis
{
Categories = arrLabel,
Labels = new XAxisLabels
{
Style = "font: 'bold 10px Verdana,sans-serif'",
Align = HorizontalAligns.Center
}
})
//set yAxis formater text
.SetYAxis(new YAxis
{
Min = 0,
Title = new YAxisTitle { Text = "Amount" }
})
//remove watermark of highcharts
.SetCredits(new Credits
{
Enabled = false
})
//set Legend
.SetLegend(new Legend
{
Enabled = true,
ItemStyle = "color: '#2C3E50'"
})
//set Series
.SetSeries(new[]
{
new Series
{
Name = "Department",
Data = new Data(data)
},
});
chartContainerColumnDetail.Text = chartColumnDetail.ToHtmlString();
}
after added code, the result become like this
[[[{"name":"DO-Advisory Department","data":["15,32"]}]],[[{"name":"DO-Advisory Department","data":["15,32","11,18"]},{"name":"EDP Department","data":["15,32","11,18"]}]],[[{"name":"DO-Advisory Department","data":["15,32","11,18","8,1"]},{"name":"EDP Department","data":["15,32","11,18","8,1"]},{"name":"Enterprise Infrastructure Services Department","data":["15,32","11,18","8,1"]}]],[[{"name":"DO-Advisory Department","data":["15,32","11,18","8,1","1,6"]},{"name":"EDP Department","data":["15,32","11,18","8,1","1,6"]},{"name":"Enterprise Infrastructure Services Department","data":["15,32","11,18","8,1","1,6"]},{"name":"Pre Sales Department","data":["15,32","11,18","8,1","1,6"]}]],[[{"name":"DO-Advisory Department","data":["15,32","11,18","8,1","1,6","1,3"]},{"name":"EDP Department","data":["15,32","11,18","8,1","1,6","1,3"]},{"name":"Enterprise Infrastructure Services Department","data":["15,32","11,18","8,1","1,6","1,3"]},{"name":"Pre Sales Department","data":["15,32","11,18","8,1","1,6","1,3"]},{"name":"Sales Department 1","data":["15,32","11,18","8,1","1,6","1,3"]}]],[[{"name":"DO-Advisory Department","data":["15,32","11,18","8,1","1,6","1,3","1,0"]},{"name":"EDP Department","data":["15,32","11,18","8,1","1,6","1,3","1,0"]},{"name":"Enterprise Infrastructure Services Department","data":["15,32","11,18","8,1","1,6","1,3","1,0"]},{"name":"Pre Sales Department","data":["15,32","11,18","8,1","1,6","1,3","1,0"]},{"name":"Sales Department 1","data":["15,32","11,18","8,1","1,6","1,3","1,0"]},{"name":"IO-DCOPS Department","data":["15,32","11,18","8,1","1,6","1,3","1,0"]}]],[[{"name":"DO-Advisory Department","data":["15,32","11,18","8,1","1,6","1,3","1,0","1,0"]},{"name":"EDP Department","data":["15,32","11,18","8,1","1,6","1,3","1,0","1,0"]},{"name":"Enterprise Infrastructure Services Department","data":["15,32","11,18","8,1","1,6","1,3","1,0","1,0"]},{"name":"Pre Sales Department","data":["15,32","11,18","8,1","1,6","1,3","1,0","1,0"]},{"name":"Sales Department 1","data":["15,32","11,18","8,1","1,6","1,3","1,0","1,0"]},{"name":"IO-DCOPS Department","data":["15,32","11,18","8,1","1,6","1,3","1,0","1,0"]},{"name":"Human Capital Department","data":["15,32","11,18","8,1","1,6","1,3","1,0","1,0"]}]]]
Update 2:
Can u form the data result like this :
List<object[]> returnColumnList = new List<object[]>();
string json = string.Empty;
var returnObject = new List<object>();
returnColumnList.Add(new object[] { "Depart" , "123", "345" });
returnColumnList.Add(new object[] { "Depart", "123", "345" });
foreach (var item in returnColumnList)
{
returnObject.Add(new {name = item.GetValue(0), data = (new object[] {item.GetValue(1) , item.GetValue(2)})});
}
json = new JavaScriptSerializer().Serialize(returnObject);
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
List item
The Series is not set properly.
Please do it this way :
series: [{
name: 'DO-Advisory Department',
data: [15, 32]
}, {
name: 'EDP Department',
data: [26, 5]
}, {
name: 'Enterprise Infrastructure Services Department',
data: [8, 1]
}]
Have attached the image of results.

querying a collection with a value greater than 0 while keeping the current month whether the value is 0 or greater than 0

I have this scenario where I need to select the Bar Object with Val greater than 0 while keeping the Object with the current month whether Val is 0 or greater than 0.
var currentMonth = new DateTime(2015, 3, 1); // Just an example
var foo = new List<Bar>()
{
new Bar { Date = '01/01/2015', Val = 40 },
new Bar { Date = '02/01/2025', Val = 30 },
new Bar { Date = '03/01/2015', Val = 0 },
new Bar { Date = '04/01/2015', Val = 2 },
new Bar { Date = '05/01/2015', Val = 5 }
}
// I also need to select the current month whether it's Val is 0 or greater than 0
// Stuck here
var fooResult = foo.Where(f => f.Val > 0);
So the result should be something like this:
{
new Bar = { Date = '03/01/2015', Val = 0 },
new Bar = { Date = '04/01/2015', Val = 2 },
new Bar = { Date = '05/01/2015', Val = 5 }
}
Or if currentMonth is declared as this. var currentMonth = new DateTime(2015, 4, 1);
The result should be something like this:
{
new Bar { Date = '04/01/2015', Val = 2 },
new Bar { Date = '05/01/2015', Val = 5 }
}
Any help would be much appreciated. Thanks
Try this
var fooResult = foo.Where(f => f.Val > 0 || currentMonth.Month ==Convert.ToDateTime(f.Date).Month);

How to specify encoding in .NET Interop.Excel.Workbooks.OpenText

I'm not able to find any information about the possibility of specifying encoding (utf-8 in particular) when opening a text file with the excel.Workbooks.OpenText method. My problem is that I'm trying to open a CSV file that is encoded in UTF-8 and without this setting it loads as a bunch of squiggles.
Thanks a lot!
I found this as a working solution to import an UTF-8 csv file:
(it can be optimized a bit, but with this you can work in the right direction)
Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
Workbook wb;
Worksheet ws;
Range range;
int[,] a = new int[,] { { 1, 1 }, { 2, 2 }, { 3, 2 }, { 4, 2 }, { 5, 2 }, { 6, 2 }, { 7, 2 }, { 8, 2 }, { 9, 2 }, { 10, 2 }, { 11, 2 }, { 12, 2 }, { 13, 2 }, { 14, 2 }, { 15, 2 }, { 16, 2 }, { 17, 2 }, { 18, 2 }, { 19, 2 }, { 20, 2 }, { 21, 2 }, { 22, 2 } };
excelApp.Workbooks.OpenText(ofdGetExcel.FileName,
65001,
1,
XlTextParsingType.xlDelimited,
XlTextQualifier.xlTextQualifierDoubleQuote,
false,
false,
false,
true,
false,
false,
false,
a,
Type.Missing,//",",
Type.Missing,//".",
Type.Missing,//false,
Type.Missing);//false);
wb = excelApp.ActiveWorkbook;
ws = wb.Worksheets.get_Item(1);
range = ws.get_Range("A2");
Microsoft.Office.Interop.Excel.QueryTable QT = ws.QueryTables.Add("TEXT;" + ofdGetExcel.FileName, range);
QT.Name = ofdGetExcel.FileName;
QT.FieldNames = true;
QT.RowNumbers = true;
QT.FillAdjacentFormulas = false;
QT.PreserveFormatting = true;
QT.RefreshOnFileOpen = false;
QT.RefreshStyle = Microsoft.Office.Interop.Excel.XlCellInsertionMode.xlInsertDeleteCells;
QT.SavePassword = false;
QT.SaveData = true;
QT.AdjustColumnWidth = true;
QT.RefreshPeriod = 0;
QT.TextFilePromptOnRefresh = false;
QT.TextFilePlatform = 65001;
QT.TextFileStartRow = 1;
QT.TextFileParseType = Microsoft.Office.Interop.Excel.XlTextParsingType.xlDelimited;
QT.TextFileTextQualifier = Microsoft.Office.Interop.Excel.XlTextQualifier.xlTextQualifierDoubleQuote;
QT.TextFileConsecutiveDelimiter = false;
QT.TextFileTabDelimiter = false;
QT.TextFileSemicolonDelimiter = false;
QT.TextFileCommaDelimiter = true;
QT.TextFileSpaceDelimiter = false;
QT.TextFileDecimalSeparator = ",";
QT.TextFileThousandsSeparator = ".";
ws.QueryTables[1].Destination.EntireColumn.AutoFit();
ws.QueryTables[1].Refresh(false);
ws.QueryTables[1].Delete();

Get value from listBox using List

I am using a ListBox and the data is a class:
private class Duration
{
public int Value { get; set; }
public string Label { get; set; }
}
I bind the class in this way:
var durations = new List<Duration>()
{
new Duration() { Value = 5, Label = "5 minutes" },
new Duration() { Value = 10, Label = "10 minutes" },
new Duration() { Value = 15, Label = "15 minutes" },
new Duration() { Value = 30, Label = "30 minutes" },
new Duration() { Value = 45, Label = "45 minutes" },
new Duration() { Value = 60, Label = "1 hour" },
new Duration() { Value = 90, Label = "1 hour and half" }
};
this.listTime.DataSource = durations;
this.listTime.DisplayMember = "Label";
this.listTime.ValueMember = "Value";
Everything works fine and the labels are show.
When i go to read the selected value, I am not able to recover the value of the selected item.
I was expecting to be able to do this:
int value = listTime.SelectedItems[0].Value;
or at least this:
Duration value = listTime.SelectedItems[0];
but this gives me error, what I am doing wrong? How is the right way to get the value of the selected item on the ListBox?
if (listTime.SelectedIndex != -1)
{
var item = listTime.SelectedItem as Duration;
//or as suggested by 'Stu'
var item = (Duration)listTime.SelectedItem;
MessageBox.Show(item.Value.ToString());
}
If you use Listbox this code is Ok:
listTime.Items[0].Value

Categories

Resources