DevExpress:从GridControl获取过滤的行

时间:2014-11-20 08:38:56

标签: c# wpf xaml mvvm devexpress

这是一个难以解释的问题,但我正在努力,因为我真的陷入困境,我不知道如何解决我的问题。

我的xaml中有一个devExpress的gridControl。它在mvvm模式设计中填充了observableCollection。在这个gridControl中,我还有一组过滤器,正常工作。

我需要过滤gridControl的内容,就像用户看到的那样。我找到了一种方法,用一个工作样本。

但是......我总是得到所有记录,而不仅仅是可见记录。

我在我的xaml背后的代码中有这个:

public interface ICustomGridControlService
{
    IList GetAllFilteredAndSortedRows();
}

public class CustomGridControlService : ServiceBase, ICustomGridControlService
{
    public static readonly DependencyProperty DataControlProperty =
        DependencyProperty.Register("DataControl", typeof(GridControl), typeof(CustomGridControlService), new PropertyMetadata(null));
    public GridControl DataControl
    {
        get { return (GridControl)GetValue(DataControlProperty); }
        set { SetValue(DataControlProperty, value); }
    }
    public IList GetAllFilteredAndSortedRows()
    {
        return DataControl.DataController.GetAllFilteredAndSortedRows();
    }
}

这在我的viewModel:

ICustomGridControlService CustomGridControlService { get { return GetService<ICustomGridControlService>(); } }
public ICommand GetAllFilteredAndSortedRowsCommand { get; private set; }

这是gridControl的xaml

<dxg:GridControl x:Name="dgrErog" ItemsSource="{Binding ListaMonitorErogazioni2}" SelectedItem="{Binding SelectedArchivioErogazioni}" >
    <dxg:GridControl.TotalSummary>
        <dxg:GridSummaryItem FieldName="{DynamicResource ResourceKey=Codice}" SummaryType="Count" DisplayFormat="Records: {0}"/>
        <dxg:GridSummaryItem FieldName="{DynamicResource ResourceKey=Litri}" SummaryType="Sum" DisplayFormat="Tot.: {0}"/>
        <dxg:GridSummaryItem FieldName="{DynamicResource ResourceKey=PU}" SummaryType="Average" DisplayFormat="P. medio: {0:c2}"/>
        <dxg:GridSummaryItem FieldName="{DynamicResource ResourceKey=Importo}" SummaryType="Sum" DisplayFormat="Tot.: {0}"/>
    </dxg:GridControl.TotalSummary>
    <dxg:GridControl.Columns>
        <dxg:GridColumn x:Name="ID" Binding="{Binding ID}" FieldName="{DynamicResource ResourceKey=Codice}" AllowEditing="False"/>
        <dxg:GridColumn Binding="{Binding TRAN_ID}" FieldName="N° tran." AllowEditing="False"/>
        <dxg:GridColumn Binding="{Binding IMPIANTO}" FieldName="{DynamicResource ResourceKey=Impianto}" AllowEditing="False">
            <dxg:GridColumn.EditSettings>
                <dxe:ComboBoxEditSettings 
                    NullText="" FilterCondition="Contains"
                    AllowNullInput="True"
                    ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window},Path=DataContext.sListImpianti}"
                    IsTextEditable="True">
                </dxe:ComboBoxEditSettings>
            </dxg:GridColumn.EditSettings>
        </dxg:GridColumn>
        <dxg:GridColumn Binding="{Binding DATA_EROG}" FieldName="{DynamicResource ResourceKey=Data}" AllowEditing="False"/>
        <dxg:GridColumn Binding="{Binding IDVEI}" FieldName="{DynamicResource ResourceKey=Veicolo}" AllowEditing="False" >
            <dxg:GridColumn.EditSettings>
                <dxe:ComboBoxEditSettings 
                    NullText="" FilterCondition="Contains"
                    AllowNullInput="True"
                    ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window},Path=DataContext.sListVeicoli}"
                    IsTextEditable="True">
                </dxe:ComboBoxEditSettings>
            </dxg:GridColumn.EditSettings>
        </dxg:GridColumn>
        <dxg:GridColumn Binding="{Binding IDTEV}" FieldName="{DynamicResource ResourceKey=TesseraV}" AllowEditing="False">
            <dxg:GridColumn.EditSettings>
                <dxe:ComboBoxEditSettings NullText="" FilterCondition="Contains" AllowNullInput="True" IsTextEditable="True"
                    ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window},Path=DataContext.sListTessereV}"/>
            </dxg:GridColumn.EditSettings>
        </dxg:GridColumn>
        <dxg:GridColumn Binding="{Binding IDGRV}" FieldName="{DynamicResource ResourceKey=GruppoV}" AllowEditing="False">
            <dxg:GridColumn.EditSettings>
                <dxe:ComboBoxEditSettings NullText="" FilterCondition="Contains" AllowNullInput="True" IsTextEditable="True"
                    ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window},Path=DataContext.sListGruppiV}"/>
            </dxg:GridColumn.EditSettings>
        </dxg:GridColumn>
        <dxg:GridColumn Binding="{Binding IDAUT}" FieldName="{DynamicResource ResourceKey=Autista}" AllowEditing="False">
            <dxg:GridColumn.EditSettings>
                <dxe:ComboBoxEditSettings NullText="" FilterCondition="Contains" AllowNullInput="True" IsTextEditable="True"
                    ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window},Path=DataContext.sListAutisti}"/>
            </dxg:GridColumn.EditSettings>
        </dxg:GridColumn>
        <dxg:GridColumn Binding="{Binding IDTEA}" FieldName="{DynamicResource ResourceKey=TesseraA}" AllowEditing="False">
            <dxg:GridColumn.EditSettings>
                <dxe:ComboBoxEditSettings NullText="" FilterCondition="Contains" AllowNullInput="True" IsTextEditable="True"
                    ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window},Path=DataContext.sListTessereA}"/>
            </dxg:GridColumn.EditSettings>
        </dxg:GridColumn>
        <dxg:GridColumn Binding="{Binding IDGRA}" FieldName="{DynamicResource ResourceKey=GruppoA}" AllowEditing="False">
            <dxg:GridColumn.EditSettings>
                <dxe:ComboBoxEditSettings NullText="" FilterCondition="Contains" AllowNullInput="True" IsTextEditable="True"
                    ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window},Path=DataContext.sListGruppiA}"/>
            </dxg:GridColumn.EditSettings>
        </dxg:GridColumn>
        <dxg:GridColumn Binding="{Binding IDPRO}" FieldName="{DynamicResource ResourceKey=Prodotto}" AllowEditing="False">
            <dxg:GridColumn.EditSettings>
                <dxe:ComboBoxEditSettings NullText="" IsTextEditable="True" FilterCondition="Contains" AllowNullInput="True"
                    ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window},Path=DataContext.sListProdotti}"/>
            </dxg:GridColumn.EditSettings>
        </dxg:GridColumn>
        <dxg:GridColumn Binding="{Binding IDERO}" FieldName="{DynamicResource ResourceKey=Erogatore}" AllowEditing="False"/>
        <dxg:GridColumn Binding="{Binding VOLUME_LT}" FieldName="{DynamicResource ResourceKey=Litri}" AllowEditing="False"/>
        <dxg:GridColumn Binding="{Binding KMATTUALI}" FieldName="{DynamicResource ResourceKey=Km}" AllowEditing="False"/>
        <dxg:GridColumn Binding="{Binding PRUNIT}" FieldName="{DynamicResource ResourceKey=PU}" AllowEditing="False" >
            <dxg:GridColumn.EditSettings>
                <dxe:TextEditSettings Mask="c" MaskType="Numeric" MaskCulture="eu" MaskUseAsDisplayFormat="True" />
            </dxg:GridColumn.EditSettings>
        </dxg:GridColumn>
        <dxg:GridColumn Binding="{Binding IMPORTO}" FieldName="{DynamicResource ResourceKey=Importo}" AllowEditing="False" >
            <dxg:GridColumn.EditSettings>
                <dxe:TextEditSettings Mask="c" MaskType="Numeric" MaskCulture="eu" MaskUseAsDisplayFormat="True" />
            </dxg:GridColumn.EditSettings>
        </dxg:GridColumn>
    </dxg:GridControl.Columns>
    <dxg:GridControl.View>
        <dxg:TableView AllowPerPixelScrolling="True" AllowEditing="False" ShowGroupPanel="False" ShowAutoFilterRow="True" ShowTotalSummary="True"
                ShowFilterPanelMode="ShowAlways" SearchPanelFindFilter="Contains"  />
    </dxg:GridControl.View>
</dxg:GridControl>

最后我以这种方式称呼它:

reportMonitorErogazioni report = new reportMonitorErogazioni();
report.DataSource = CustomGridControlService.GetAllFilteredAndSortedRows();
PrintHelper.ShowPrintPreview(MainWindow.thisW, report);
它似乎工作得很好,但是,就像我之前说过的那样,它总能获得所有记录。所以,你有什么想法吗?我可以发布其他有用的东西来解决问题吗?

2 个答案:

答案 0 :(得分:0)

从您的回答中我发现您只需从网格中获取可见行。如果是这样,您应该使用遍历网格的行(逐个访问行)而不是直接从DataController获取行。 要实现此目标,您可以使用GridControl.GetRowHandleByVisibleIndex()方法。有关更多信息,请参阅Obtaining Row Handles文档文章。

Traversing Rows文章演示了实现此方法的可能代码段。

P.S。 DevExpress Search Engine可以比我更快地获得所有答案。)

答案 1 :(得分:0)

前段时间我遇到了同样的问题。 看看以下链接。

synchronize filtered data between the GridControl and ViewModel

example provided by Devexpress Team