【问题标题】:Not able to clear datagrid view in c#无法在 C# 中清除数据网格视图
【发布时间】:2016-12-05 14:16:01
【问题描述】:

每次调用函数时,我都会尝试将数据从变量添加到数据网格。此外,我确保每次调用函数时都会清除网格。但是每次我调用该函数时都会附加数据。谁能帮我这个?数据绑定是一个包含字符串变量作为成员的类。

XAML

<TextBox 
    x:Name="TextOutput" 
    HorizontalAlignment="Left" 
    Height="44" 
    Margin="23,56,0,0" 
    Grid.Row="9" 
    TextWrapping="Wrap" 
    VerticalAlignment="Top" 
    Width="545" 
    Grid.ColumnSpan="2" 
    BorderBrush="{DynamicResource {x:Static SystemColors.DesktopBrushKey}}"
    />
<Button 
    x:Name="bootUpMsg" 
    Content="Read Boot Up Msg" 
    Margin="22,28,59,0" 
    Grid.Row="9" 
    VerticalAlignment="Top" 
    Click="onBootUpClick" 
    Background="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" 
    Foreground="{DynamicResource {x:Static SystemColors.ActiveCaptionTextBrushKey}}" 
    IsEnabled="False"
    />
<Button 
    x:Name="startRead" 
    Content="Start Real Data RD" 
    HorizontalAlignment="Left" 
    Margin="163,28,0,0" 
    Grid.Row="9" 
    VerticalAlignment="Top" 
    Width="120" 
    ToolTip="Start reading data" 
    ToolTipService.ShowDuration="800" 
    Click="onStartClick" 
    Grid.ColumnSpan="2" 
    Background="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" 
    Foreground="{DynamicResource {x:Static SystemColors.ActiveCaptionTextBrushKey}}" 
    IsEnabled="False"
    />
<DataGrid 
    x:Name="dataGrid" 
    HorizontalAlignment="Left" 
    Margin="12,110,0,0" 
    Grid.Row="9" 
    VerticalAlignment="Top" 
    Height="352" 
    Width="858" 
    Grid.ColumnSpan="3" 
    BorderBrush="{DynamicResource {x:Static SystemColors.DesktopBrushKey}}" 
    Background="{DynamicResource {x:Static SystemColors.GradientInactiveCaptionBrushKey}}" 
    Foreground="{DynamicResource {x:Static SystemColors.ActiveCaptionTextBrushKey}}"
    >
    <DataGrid.Columns>
        <DataGridTextColumn Header="Sl.No"            Width="50"   Binding="{Binding Path=Sl_No}"/>
        <DataGridTextColumn Header="Task ID"          Width="50"   Binding="{Binding Path=TaskID}"/>
        <DataGridTextColumn Header="Task Name"        Width="150"  Binding="{Binding Path=TaskName}"/>
        <DataGridTextColumn Header="Core ID"          Width="50"   Binding="{Binding Path=CoreID}" />
        <DataGridTextColumn Header="Start Time (μs)"  Width="100"  Binding="{Binding Path=StartTime}"/>
        <DataGridTextColumn Header="End Time (μs)"    Width="100"  Binding="{Binding Path=StopTime}"/>
        <DataGridTextColumn Header="Run Time(μs)"     Width="80"   Binding="{Binding Path=ExecutedTime}"/>
        <DataGridTextColumn Header="Runnable Address" Width="105"  Binding="{Binding Path=FunctAdd}"/>
        <DataGridTextColumn Header="Runnable Name"    Width="200"  Binding="{Binding Path=FunctName}"/>
    </DataGrid.Columns>
</DataGrid>

C#

  public void displayDetails(int scale)
    {
        dGrid.Items.Clear();
        dGrid.Items.Refresh();
        int taskCount = 0;
        int tasklevel = 0;
        List<dataBinding> griddata=new List<dataBinding>();
        CTask interruptedtask;
        System.Collections.Stack taskstack = new System.Collections.Stack();
        int slCnt = 0;
        foreach (CCore c in _viewModel.coreList)
        {
            c.taskList.Sort();//sorting of tasks in tasklist before plotting
            taskCount = 0;
            tasklevel = 0;
            foreach (CTask t in c.taskList)
            {
                slCnt++;
                var data = new dataBinding
                {
                    Sl_No = slCnt.ToString(),
                    FunctName = "-",
                    FunctAdd = "-",
                    StartTime = t.taskStartTime.ToString(),
                    StopTime = t.taskEndTime.ToString(),
                    CoreID = c.coreName.ToString(),
                    TaskID = t.task_id.ToString(),
                    TaskName = t.taskName,
                    ExecutedTime = t.runTime.ToString(),
                };
              dGrid.Items.Add(data);
                if (taskstack.Count == 0)
                {
                    taskstack.Push(t);
                }
                else
                {
                    while (taskstack.Count != 0)
                    {
                        interruptedtask = (CTask)taskstack.Pop();
                        if (t.taskStartTime > interruptedtask.taskStartTime && t.taskEndTime < interruptedtask.taskEndTime)
                        {
                            tasklevel++;
                            taskstack.Push(interruptedtask);
                            taskstack.Push(t);
                            break;
                        }
                        else
                        {
                            if (taskstack.Count == 0)
                            {
                                taskstack.Push(t);
                                break;
                            }
                            if (tasklevel != 0)
                            {
                                tasklevel--;
                            }
                        }
                    }
                }
                ++taskCount;
                if (t.taskEndTime != 0)
                {
                    currentTaskRect = new Rectangle
                    {
                        Width = horizonatlZoom * 40 * (Math.Abs((t.taskEndTime - t.taskStartTime) / scale)),
                        Height = 10 + (verticalZoom) * 2,
                        Fill = _taskcolour[t.task_id],
                        Stroke = Brushes.Black,
                        StrokeThickness = .4,
                        ToolTip = t.taskName + " : " + t.taskStartTime + " - " + t.taskEndTime + ", Duration-" + (t.taskEndTime - t.taskStartTime) + "μs"
                    };
                }
                switch (c.coreName)
                {
                    case "core0":
                        if (t.taskEndTime != 0)
                            _myCanvas.Width = ((t.taskEndTime + scale) * 40 * horizonatlZoom) / scale;
                        _myCanvas.MaxWidth = _myCanvas.Width;
                        if (!_myCanvas.Children.Contains(currentTaskRect))
                        {
                            _myCanvas.Children.Add(currentTaskRect);
                            Canvas.SetLeft(currentTaskRect, horizonatlZoom * 40 * ((t.taskStartTime) / scale));
                            Canvas.SetBottom(currentTaskRect, 420 + tasklevel * (35 + (verticalZoom) * 4));
                        }
                        break;
                    case "core1":
                        if (t.taskEndTime != 0)
                            _myCanvas.Width = ((t.taskEndTime + scale) * 40 * horizonatlZoom) / scale;
                        if (!_myCanvas.Children.Contains(currentTaskRect))
                        {
                            _myCanvas.Children.Add(currentTaskRect);
                            Canvas.SetLeft(currentTaskRect, horizonatlZoom * 40 * ((t.taskStartTime) / scale));
                            Canvas.SetBottom(currentTaskRect, 220 + tasklevel * (35 + (verticalZoom) * 4));
                        }
                        break;
                    case "core2":
                        if (t.taskEndTime != 0)
                            _myCanvas.Width = ((t.taskEndTime + scale) * 40 * horizonatlZoom) / scale;
                        if (!_myCanvas.Children.Contains(currentTaskRect))
                        {
                            _myCanvas.Children.Add(currentTaskRect);
                            Canvas.SetLeft(currentTaskRect, horizonatlZoom * 40 * ((t.taskStartTime) / scale));
                            Canvas.SetBottom(currentTaskRect, 20 + tasklevel * (35 + (verticalZoom) * 4));
                        }
                        break;
                    default:
                        if (t.taskEndTime != 0)
                            _myCanvas.Width = ((t.taskEndTime + scale) * 40 * horizonatlZoom) / scale;
                        if (!_myCanvas.Children.Contains(currentTaskRect))
                        {
                            _myCanvas.Children.Add(currentTaskRect);
                            Canvas.SetLeft(currentTaskRect, horizonatlZoom * 40 * ((t.taskStartTime) / scale));
                            Canvas.SetBottom(currentTaskRect, 20 + tasklevel * (35 + (verticalZoom) * 4));
                        }
                        break;
                }
                foreach (CRunnable r in t.runableList)
                {
                    // draw runnable rectangles 
                    slCnt++;
                    var data2 = new dataBinding
                    {
                        Sl_No = slCnt.ToString(),
                        FunctName = r.runnableName,
                        FunctAdd = r.runnableaddress.ToString("X"),
                        StartTime = r.startTime.ToString(),
                        StopTime = r.endTime.ToString(),
                        CoreID = c.coreName.ToString(),
                        TaskID = t.task_id.ToString(),
                        TaskName = t.taskName,
                        ExecutedTime = r.runTime.ToString()
                    };
                    dGrid.Items.Add(data2);
                    if (r.endTime != 0)
                    {
                        currentTaskRect = new Rectangle
                        {
                            Width = horizonatlZoom * 40 * (Math.Abs((r.endTime - r.startTime) / scale)),
                            Height = 20 + (verticalZoom) * 2,
                            Fill = r.runnableName == "NOTFOUND" ? brushArray[5] : _runnablecolour[r.runnableaddress.ToString("X")],
                            Stroke = Brushes.Black,
                            StrokeThickness = .4,
                            ToolTip = r.runnableName + " : " + r.startTime + " - " + r.endTime + ", Duration-" + (r.endTime - r.startTime) + "μs"
                        };
                    }
                    switch (c.coreName)
                    {
                        case "core0":

                            if (!_myCanvas.Children.Contains(currentTaskRect))
                            {
                                _myCanvas.Children.Add(currentTaskRect);
                                Canvas.SetLeft(currentTaskRect, horizonatlZoom * 40 * ((r.startTime) / scale));
                                Canvas.SetBottom(currentTaskRect, 430 + tasklevel * (35 + (verticalZoom) * 4) + (verticalZoom) * 2);
                            }
                            break;
                        case "core1":

                            if (!_myCanvas.Children.Contains(currentTaskRect))
                            {
                                _myCanvas.Children.Add(currentTaskRect);
                                Canvas.SetLeft(currentTaskRect, horizonatlZoom * 40 * ((r.startTime) / scale));
                                Canvas.SetBottom(currentTaskRect, 230 + tasklevel * (35 + (verticalZoom) * 4) + (verticalZoom) * 2);
                            }
                            break;
                        case "core2":

                            if (!_myCanvas.Children.Contains(currentTaskRect))
                            {
                                _myCanvas.Children.Add(currentTaskRect);
                                Canvas.SetLeft(currentTaskRect, horizonatlZoom * 40 * ((r.startTime) / scale));
                                Canvas.SetBottom(currentTaskRect, 30 + tasklevel * (35 + (verticalZoom) * 4) + (verticalZoom) * 2);
                            }
                            break;
                        default:

                            if (!_myCanvas.Children.Contains(currentTaskRect))
                            {
                                _myCanvas.Children.Add(currentTaskRect);
                                Canvas.SetLeft(currentTaskRect, horizonatlZoom * 40 * ((r.startTime) / scale));
                                Canvas.SetBottom(currentTaskRect, 30 + tasklevel * (35 + (verticalZoom) * 4) + (verticalZoom) * 2);
                            }
                            break;
                    }
                }
            }
        }

【问题讨论】:

  • 你在哪里设置了 dGrid 数据源?你能不说清楚吗?而不是试图直接操作网格中的项目?
  • 其实我没看懂你的问题。我将数据与 xaml 中的数据网格绑定,在上面的函数中,我正在调用 dGrid.items.add(data) ,其中 data 是一个类对象。
  • 不,实际上你并没有绑定数据。您正在将其推入 DataGrid 的 Items 集合中。数据绑定将使用 ItemsSource 属性和 XAML 中的 {Binding } 表达式。您在 WPF 上强制使用 WinForms 模式。你正在做的不是 WPF 做事的方式。我不确定您想要达到的效果,但我确信这可以通过使用 DataTemplates 和简单的绑定来完成。这段代码实在是太复杂了。

标签: c# wpf xaml datagrid


【解决方案1】:

如果在调用 dGrid.Items.Clear() 后数据再次附加到 DataGrid 的 Items 集合中,则需要确保同时清除 _viewModel.coreList 集合或/和 taskList 集合视图模型中的每个 coreList 都在此处。

否则,相同的项目显然会在被清除后再次添加到 DataGrid,因为您正在迭代这些集合并在 displayDetails 方法中将它们添加到 DataGrid 的 Items 集合中......

【讨论】:

    猜你喜欢
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多