WPF GridControl:阻止DataControlDetailDescriptor GridControl中的行选择或在详细选择上选择master

时间:2014-09-24 05:44:26

标签: c# wpf devexpress gridcontrol

我没有找到任何令人满意的答案或解决我的问题。我有一个主 - 细节网格(仅限2个级别),仅限单个选择。一些相关的代码:

<dxg:GridControl AutoGenerateColumns="None" Name="gridControlMaster" AutoExpandAllGroups="True">
    <dxg:GridControl.View>
        <dxg:TableView ShowGroupPanel="False" />
    </dxg:GridControl.View>
    <dxg:GridControl.Columns>
        <dxg:GridColumn FieldName="Entry.Date" Header="Entry date" Visible="True" AllowEditing="False" />
    </dxg:GridControl.Columns>
    <dxg:GridControl.DetailDescriptor>
        <dxg:DataControlDetailDescriptor ItemsSourcePath="EntrySubList" ShowHeader="False">
            <dxg:DataControlDetailDescriptor.DataControl>
                <dxg:GridControl AutoGenerateColumns="None" AutoExpandAllGroups="True">
                    <dxg:GridControl.View>
                            <dxg:TableView AutoWidth="True" ShowGroupPanel="False" ShowColumnHeaders="False" />
                        </dxg:GridControl.View>
                    <dxg:GridControl.Columns>
                        <dxg:GridColumn FieldName="Label" Header="Label" Visible="True" AllowEditing="False" />
                        <dxg:GridColumn FieldName="Value" Header="Value" Visible="True" AllowEditing="False" />
                    </dxg:GridControl.Columns>
                </dxg:GridControl>
            </dxg:DataControlDetailDescriptor.DataControl>
        </dxg:DataControlDetailDescriptor>
    </dxg:GridControl.DetailDescriptor>
</dxg:GridControl>

在某些时候(比如在GridControl外面点击一些按钮)我需要当前选中的主网格项,而不管细节网格中选择的子项是什么!目前,如果我单击主网格中的某一行,然后单击详细网格中的某些行(主网格中除了先前选定的行之外还有其他父级),则CurrentItem或SelectedItem不是所需的行(它是最后选择的项目)主网格,它应该至少是当前highlited细节项的父级)。这可能会误导用户。

理想的解决方案是使用某种“选择单元”,在我的例子中是整个主项目,以及所有子项目(详细网格)。因此,对于网格用户点击,主要或详细信息中的任何项目,都会选择主项目及其所有子项目(高亮显示)。主网格的CurrentItem是当前选定的父项。

另一种可能的解决方案是仅允许选择主网格项 - 并防止在详细网格中进行选择(仅在设计上选择SelectionMode = none GridControl不会这样做!)。在这种情况下,另一个很好的功能是单击子项(尝试选择它)在主网格中选择其父项。

如果需要任何进一步的信息,我会提供。

谢谢你的回答。

2 个答案:

答案 0 :(得分:1)

据我所知,您描述的问题已在DevExpress支持中心的上下文中讨论过 Master-detail grid SelectedItem behaves unexpectedly when clicking detail rows线程。 此线程中提供的解决方案 - 创建与主View的所选项关联的附加属性,并在FocusedViewChanged事件处理程序中更新此属性。请查看上面讨论的sample project。我相信它应该会把你推向正确的方向。

答案 1 :(得分:0)

谢谢你的指针,它真的帮助了我。我之前已经尝试过使用FocusedView属性,但显然不是正确的方法(可能在错误的网格级别)。你的回答和链接帮助我解决了我的问题。

我做了类似的事情:

<dxg:GridControl AutoGenerateColumns="None" Margin="0,36,1,0" Name="gridControlMaster" AutoExpandAllGroups="True">
                                            <dxg:GridControl.View>
                                                <dxg:TableView ShowGroupPanel="False" FocusedViewChanged="gridControlMaster_TableView_FocusedViewChanged" />

void gridControlMaster_TableView_FocusedViewChanged(object sender, FocusedViewChangedEventArgs e)
{
            int rowHandle = ((GridControl)e.NewView.DataControl).GetMasterRowHandle();
            if (GridControl.InvalidRowHandle == rowHandle) return;                            

            gridControlMaster.SelectedItem = gridControlMaster.GetRow(rowHandle);
}

绑定到主GridControl的SelectedItem属性的某些测试TextBox显示在Detail GridControl中选择子项时选择的右主记录。这对我来说已经足够了。