我已经用blazor构建了一个很好的图表(服务器端)组件。它使用了jschart。一切都很好,而且它工作得很好。
在ChartComponent中。我有这个。
@using Blazorise.Charts
<Div Style=@($"position: relative; height:{ViewHeight}vh; width:{ViewWidth}vw;")>
<LineChart @ref="lineChart" TItem="double" Clicked="@OnClicked" Options="@chartOptions"/>
</Div>
(notelineChart引用),并在Razor.cs文件中定义了一个lineChart变量(在Razor Page中用作Ref)
LineChart<double> lineChart;
问题是,当我把它放在没有foreach的页面上时,一切都工作正常。
<ChartComponent ViewHeight=50 ViewWidth=80 ColorScheme="Classic20" Multiple=true Items=@items></ChartComponent>
但是现在我想在页面中添加多个这样的组件。
@foreach (string graphSelector in datasets)
{
<ChartComponent ViewHeight=50 ViewWidth=80 ColorScheme="Classic20" Multiple=true Items=@(items.Where(p => p.CounterInstance == graphSelector).ToList())></ChartComponent>
}
但是当我把它放在foreach中时,我会得到一个错误,说明lineChart为null...我已经尝试了几种方法,但我猜我缺少了一些东西。
在chart组件中我做的
await lineChart.Clear();
这给了我一个
未将对象引用设置为对象的示例。
尝试了几种方法,但不知道如何解决。
我尝试了MetinYakar.NET提出的解决方案,但仍然得到了相同的结果。
图表组件不为空,但图表组件中的某些变量为空。
看起来,当组件在第一次呈现期间位于页面上时,它将工作,但当组件在第一次呈现期间不在页面上时,组件没有正确初始化,图表本身的呈现将失败。
我在ChartComponent中有以下代码。
private async Task DataSetToChartSeries()
{
// Create a list of date labels
string[] dateLabels = Items.Select(x => x.TimeRun.ToString("yyyy-MM-dd hh:mm")).Distinct().ToArray();
await lineChart.Clear();
await lineChart.AddLabels(dateLabels);
if (Multiple == true)
{
List<string> datasets = Items.Select(p => p.CounterInstance).Distinct().ToList();
foreach (string graphSelector in datasets)
{
List<QueryResult> graphDataSet = Items.Where(p => p.CounterInstance == graphSelector).ToList();
await lineChart.AddDataSet(GetLineChartDataset(graphDataSet));
}
}
else
{
await lineChart.AddDataSet(GetLineChartDataset(Items));
}
await lineChart.Update(); <-- This line causes the error
}
我也有这个在剃刀文件:
@* Does not work*@
@* @foreach (string key in chartSeries.Keys)
{
<ChartComponent ViewHeight=20 ViewWidth=80 ColorScheme="Classic20" Multiple=true Items=@(GetChartSeries(key))></ChartComponent>
}*@
@*This does work but is not dynamic*@
<ChartComponent ViewHeight=20 ViewWidth=80 ColorScheme="Classic20" Multiple=true Items=@(GetChartSeries("Error"))></ChartComponent>
<ChartComponent ViewHeight=20 ViewWidth=80 ColorScheme="Classic20" Multiple=true Items=@(GetChartSeries("Information"))></ChartComponent>
<ChartComponent ViewHeight=20 ViewWidth=80 ColorScheme="Classic20" Multiple=true Items=@(GetChartSeries("Warning"))></ChartComponent>
该问题与第一次呈现项目时图表不存在有关。
3条答案
按热度按时间3zwjbxry1#
你需要在blazor项目中使用一个属性值并添加第一个声明。
并为视图中的显示选中null
jdg4fx2g2#
Items=@(items.Where(p => p.CounterInstance == graphSelector)
在我看来有点可疑。CounterInstance
是字符串吗?字符串graphSelector
中有什么?我认为这些听起来都不像是字符串。你抱怨说
会产生
lineChart
为null
的错误,但<ChartComponent>
中没有类似的内容biswetbf3#
好了,谢谢你们的帮助.
我接受了Henk的建议,从Blazorise图表示例的代码库开始,我像使用自己的组件一样 Package 它,令我惊讶的是,我可以在页面中添加多个这样的代码。
经过大量的跟踪和尝试,最重要的变化是我将图表的初始化移到了OnAfterRenderAsync。
这让一切都不同了