Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 分层数据网格子对象_C#_Wpf_Datagrid_Telerik_Hierarchicaldatatemplate - Fatal编程技术网

C# 分层数据网格子对象

C# 分层数据网格子对象,c#,wpf,datagrid,telerik,hierarchicaldatatemplate,C#,Wpf,Datagrid,Telerik,Hierarchicaldatatemplate,MainXaml.Cs <telerik:RadGridView x:Name="rgvData" CanUserFreezeColumns="False" GridLinesVisibility="Horizontal" IsReadOnly="False" AutoGenerateColumns="False" telerik:Theming.Theme="Office_Blue" ItemsSource="{Binding}" >

MainXaml.Cs

<telerik:RadGridView x:Name="rgvData" CanUserFreezeColumns="False" GridLinesVisibility="Horizontal" IsReadOnly="False" AutoGenerateColumns="False"
                         telerik:Theming.Theme="Office_Blue" ItemsSource="{Binding}" >
        <telerik:RadGridView.ChildTableDefinitions>
            <telerik:GridViewTableDefinition />
        </telerik:RadGridView.ChildTableDefinitions>
        <telerik:RadGridView.Columns>
            <telerik:GridViewDataColumn DataMemberBinding="{Binding StudentID}" Header="Category ID" />
            <telerik:GridViewDataColumn DataMemberBinding="{Binding StudentFN}" Header="Category Name" />
            <telerik:GridViewDataColumn DataMemberBinding="{Binding StudentLN}" Header="Description" />
            <telerik:GridViewDataColumn DataMemberBinding="{Binding Picture}" Header="Picture" />
        </telerik:RadGridView.Columns>
        <telerik:RadGridView.HierarchyChildTemplate>
            <DataTemplate>
                <telerik:RadGridView x:Name="RadGridView1" Loaded="rgvData_Loaded" ShowInsertRow="True"  CanUserInsertRows="True"  ItemsSource="{Binding Subjects}" CanUserFreezeColumns="False" AutoGenerateColumns="False" ShowGroupPanel="False" IsReadOnly="False">
                    <telerik:RadGridView.Columns>
                        <telerik:GridViewDataColumn DataMemberBinding="{Binding SubjectID}" Header="Order ID" />
                        <telerik:GridViewDataColumn DataMemberBinding="{Binding SubjectName}" Header="Employee ID" />
                        <telerik:GridViewDataColumn DataMemberBinding="{Binding SubjectProfessor}" Header="Order Date" />
                        <telerik:GridViewDataColumn DataMemberBinding="{Binding ShipCountry}" Header="Ship Country" />
                    </telerik:RadGridView.Columns>
                </telerik:RadGridView>
            </DataTemplate>
        </telerik:RadGridView.HierarchyChildTemplate>
    </telerik:RadGridView>
公共部分类主窗口:窗口
{
DataAccessDataContext m_dcData;
公共主窗口()
{
初始化组件();
this.Loaded+=新的RoutedEventHandler(主窗口已加载);
this.rgvData.Items.CollectionChanged+=新的NotifyCollectionChangedEventHandler(Items\u CollectionChanged);
rgvData.Filtered+=新事件处理程序(rgvData_Filtered);
}
已加载无效rgvData_(对象发送器,路由目标e)
{
var childGrid=(RadGridView)发送方;
var parentRow=childGrid.parentRow;
if(parentRow!=null)
{
rgvData.SelectedItem=childGrid.DataContext;
parentRow.IsExpandedChanged+=新路由EventHandler(parentRow_IsExpandedChanged);
}
}
void parentRow_IsExpandedChanged(对象发送方,RoutedEventArgs e)
{
rgvData.SelectedItem=((GridViewRow)sender).DataContext;
}x
void rgvData_Filtered(对象发送方,Telerik.Windows.Controls.GridView.gridviewfilteredventargs e)
{
DataContext=m_dcData;
m_dcData=new DataAccessDataContext();
m_dcData.Log=Console.Out;
rgvData.ItemsSource=m_dcData.Students;
rgvData.ShowInsertRow=true;
}
私有无效项\u CollectionChanged(对象发送方,NotifyCollectionChangedEventArgs e)
{
尝试
{
if(e.Action==NotifyCollectionChangedAction.Add)
{
foreach(e.NewItems中的学生项目)
{
m_dcData.Students.InsertOnSubmit(项目);
}
}
if(e.Action==NotifyCollectionChangedAction.Remove)
{
foreach(e.OldItems中的学生项目)
{
m_dcData.Students.deleteosubmit(项目);
}
}
}
捕获(异常s)
{ }
}
已加载无效主窗口(对象发送器、路由目标)
{
m_dcData=new DataAccessDataContext();
m_dcData.Log=Console.Out;
rgvData.ItemsSource=m_dcData.Students;
rgvData.ShowInsertRow=true;
rgvData.ItemsSource=m_dcData.Students;
rgvData.ShowInsertRow=true;
}
}

您好,我在加载与其父源相关的子数据时没有问题。问题是,如果我尝试展开另一行,它将加载该行的第一个数据。例如,如果我展开了行1,它将显示正确的子表,但如果我转到行2并展开它,它的子记录将用于行1。我试图寻找答案,并将parent_IsExpandedChanged事件用于处理它,但它仍然无法显示正确的数据。如果我再次尝试重新加载应用程序并尝试展开第2行或第3行。它的子项是正确的,但是如果我展开另一行,它将显示第2行或第3行的子项。请说明我做错了什么

您的XAML看起来不错,但我看不出您发布的代码会导致问题。您确认加载的数据正确吗?实际上,您可能正在为每个学生加载相同的科目数据。 通过将此代码放入窗口上的按钮单击事件中,您可以轻松地进行检查:

public partial class MainWindow : Window
{
    DataAccessDataContext m_dcData;
    public MainWindow()
    {
        InitializeComponent();
        this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
        this.rgvData.Items.CollectionChanged += new NotifyCollectionChangedEventHandler(Items_CollectionChanged);
        rgvData.Filtered += new EventHandler<Telerik.Windows.Controls.GridView.GridViewFilteredEventArgs>(rgvData_Filtered);
    }

    void rgvData_Loaded(object sender, RoutedEventArgs e)
    {
        var childGrid = (RadGridView)sender;
    var parentRow = childGrid.ParentRow;

    if (parentRow != null)
    {
        rgvData.SelectedItem = childGrid.DataContext;
        parentRow.IsExpandedChanged += new RoutedEventHandler(parentRow_IsExpandedChanged);
    }
     }

void parentRow_IsExpandedChanged(object sender, RoutedEventArgs e)
{
    rgvData.SelectedItem = ((GridViewRow)sender).DataContext;
}x


    void rgvData_Filtered(object sender, Telerik.Windows.Controls.GridView.GridViewFilteredEventArgs e)
    {
        DataContext = m_dcData;
        m_dcData = new DataAccessDataContext();
        m_dcData.Log = Console.Out;
        rgvData.ItemsSource = m_dcData.Students;
        rgvData.ShowInsertRow = true;
    }

    private void Items_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        try
        {
            if (e.Action == NotifyCollectionChangedAction.Add)
            {
                foreach (Student item in e.NewItems)
                {
                    m_dcData.Students.InsertOnSubmit(item);
                }
            }
            if (e.Action == NotifyCollectionChangedAction.Remove)
            {
                foreach (Student item in e.OldItems)
                {
                    m_dcData.Students.DeleteOnSubmit(item);
                }
            }
        }
        catch (Exception s)
        { }
    }
    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        m_dcData = new DataAccessDataContext();
        m_dcData.Log = Console.Out;
        rgvData.ItemsSource = m_dcData.Students;
        rgvData.ShowInsertRow = true;

        rgvData.ItemsSource = m_dcData.Students;
        rgvData.ShowInsertRow = true;
    }
}
IEnumerable list=(IEnumerable)this.DataContext;
foreach(学生中的学生stu)
{
Debug.WriteLine(stu.StudentID+“:”);
foreach(学习科目中的科目子科目)
{
Debug.WriteLine(\\t“+sub.subject)
}
}

im使用linq to sql类从sqlIt获取数据看起来您的问题是因为网格…尝试使用telerik中的论坛(响应速度非常快…还可以在您的问题中添加标记“telerik”…这样可以很容易地识别HI。如果您加载了,您不需要处理加载的事件。对于急切加载的数据,您可以尝试根网格上的RowisExpandedChange事件。对您的子项使用ObservableCollection。
IEnumerable<Student> list = (IEnumerable<Student>)this.DataContext;
foreach(Student stu in Students)
{
    Debug.WriteLine(stu.StudentID + ":");
    foreach(Subject sub in stu.Subjects)
    {
        Debug.WriteLine("\\t" + sub.SubjectID)
    }
}