Фильтр DevExpress AspxGridView в ObjectDataSource - PullRequest
0 голосов
/ 16 марта 2010

Еще одна проблема с DevExpress AspxGridView:)

Контекст:

  • Одна страница

  • На странице пользовательский элемент управления

  • В пользовательском элементе управления AspxDropDown

  • AspxDropDown, имеет DropDownWindowTemplate

  • В DropDownItemTemplate я добавляю GridView и ObjectDataSource с поддержкой подкачки / сортировки / фильтрации

  • При обработке события Selecting ObjectDataSource я должен установить параметры фильтра для источника данных. Там параметры фильтра должны поступать из FilterRow AspxGridView (предпочтительно с использованием свойства AspxGriedView.FilterExpression).

Проблема: для свойства AspxGriedView.FilterExpression не заданы правильные значения (устанавливаемые пользователем).

Кто-нибудь нашел хорошую реализацию того, что я пытаюсь сделать здесь?

Спасибо большое.

:)

Ответы [ 2 ]

1 голос
/ 22 марта 2010

Мне наконец-то удалось обойти проблему.

Не хорошее решение, но, тем не менее, способ обойти это.

Итак. «Решением» является привязка данных к сетке для каждого события AfterPerformCallback.

void grid_AfterPerformCallback(object sender, ASPxGridViewAfterPerformCallbackEventArgs e)
    {
        ((DevExpress.Web.ASPxGridView.ASPxGridView)sender).DataBind();
    }

Как я уже сказал, это не очень хорошее решение.

0 голосов
/ 07 сентября 2011

Ответ на DevExpress заключается в том, что правильное выражение FilterExpression обновляется, когда оно связано с данными.

Они утверждают, что в BeforePerformDataSelect вы увидите правильное значение.

У меня есть 1 сетка, которая подключена к SqlDataSource, которая правильно делает это, и другая, которая не ... Так что ваш пробег может отличаться

Моя вторая сетка не подчинялась этому принципу, поэтому я интегрировал концепцию привязки другого парня в AfterPerformCallback (). Хитрость заключается в том, чтобы предотвратить двойной запрос. Этот код также демонстрирует, как взломать devexpress для создания собственного SQL. Очевидно, это из моего рабочего проекта, так что используйте свое воображение на функции, которые у меня есть, что вы не ...

Вот соответствующий HTML-код и код:

<dxwgv:ASPxGridView ID="grid" runat="server" 
    KeyFieldName="OrderID"
    OnAfterPerformCallback="grid_AfterPerformCallback"
    OnBeforePerformDataSelect="grid_BeforePerformDataSelect"
    AutoGenerateColumns="True"
    SettingsDetail-AllowOnlyOneMasterRowExpanded="true" 
    Settings-ShowFilterRow="true"
    Settings-ShowFilterRowMenu="True"
    SettingsBehavior-AllowSelectSingleRowOnly="true"
    OnDetailRowExpandedChanged="Grid_DetailRowExpandedChanged" 
    Styles-Cell-Cursor="pointer"
    SettingsBehavior-EnableRowHotTrack="true" 
    CssFilePath="~/App_Themes/Office2010Blue/{0}/styles.css"
    CssPostfix="Office2010Blue"
    SettingsPager-PageSize="<%# this._GridRowsPerPage %>"
    SettingsBehavior-ColumnResizeMode="Control" 
    SettingsCustomizationWindow-PopupHorizontalAlign="WindowCenter" 
    SettingsCustomizationWindow-PopupVerticalAlign="WindowCenter"
    SettingsCustomizationWindow-Width="300px"
    Settings-ShowHorizontalScrollBar="true" 
    Width="<%# this._GetWidth() %>"
    SettingsPager-AlwaysShowPager="true"
    SettingsCookies-Enabled="true"
    >
    <Columns>
        <dxwgv:GridViewDataColumn FieldName="PriorityType" Visible="false" />
        <dxwgv:GridViewDataColumn FieldName="basePatientID" Caption="PTID" />
        <dxwgv:GridViewDataColumn FieldName="FirstName" />
        <dxwgv:GridViewDataColumn FieldName="LastName" />
        <dxwgv:GridViewDataColumn FieldName="Employer" />
        <dxwgv:GridViewDataColumn FieldName="Insurer" />
        <dxwgv:GridViewDataColumn FieldName="ClaimJurisdiction" Caption="Jurisdiction" />
        <dxwgv:GridViewDataColumn FieldName="DOB" Visible="false" />
        <dxwgv:GridViewDataColumn FieldName="DateOfInjury" Caption="DOI" Visible="false" />
        <dxwgv:GridViewDataColumn FieldName="PostalCode" Caption="ZipCode" Visible="false" />
        <dxwgv:GridViewDataColumn FieldName="FirstCareDate" Visible="false" />
        <dxwgv:GridViewDataColumn FieldName="LastCareDate" Visible="false" />
        <dxwgv:GridViewDataColumn FieldName="IntakeStatus" />
        <dxwgv:GridViewDataColumn FieldName="SchedulingNeeded" />
        <dxwgv:GridViewDataColumn FieldName="InitialReferralDate" Caption="Date Assigned" />

        <dxwgv:GridViewDataColumn FieldName="Orders_UpdatedOn" Caption="Last Follow-up" />


        <dxwgv:GridViewDataColumn FieldName="RequestTypes" Caption="Service" Visible="false" />
        <dxwgv:GridViewDataColumn FieldName="FacilityGroups" Caption="Provider" Visible="false" />
        <dxwgv:GridViewDataColumn FieldName="ICD9Codes" Visible="false" />
        <dxwgv:GridViewDataColumn FieldName="CPTCodes" Visible="false" />
        <dxwgv:GridViewDataColumn FieldName="OrderCategory" Caption="Source" />
        <dxwgv:GridViewDataColumn FieldName="CaseCoordinator" Visible="false" />
        <dxwgv:GridViewDataColumn FieldName="SchedulingTier" Visible="false" Caption="Tier" />
        <dxwgv:GridViewDataColumn FieldName="LockRequest_UserName" Visible="true" Caption="InUseBy" />
    </Columns>
    <Styles CssFilePath="~/App_Themes/Office2010Blue/{0}/styles.css" CssPostfix="Office2010Blue">
        <Header ImageSpacing="5px" SortingImageSpacing="5px">
        </Header>
        <LoadingPanel ImageSpacing="10px">
        </LoadingPanel>
    </Styles>
    <ImagesFilterControl>
        <LoadingPanel Url="~/App_Themes/Office2010Blue/Editors/Loading.gif">
        </LoadingPanel>
    </ImagesFilterControl>
    <Images SpriteCssFilePath="~/App_Themes/Office2010Blue/{0}/sprite.css">
        <LoadingPanelOnStatusBar Url="~/App_Themes/Office2010Blue/GridView/gvLoadingOnStatusBar.gif">
        </LoadingPanelOnStatusBar>
        <LoadingPanel Url="~/App_Themes/Office2010Blue/GridView/Loading.gif">
        </LoadingPanel>
    </Images>
    <ClientSideEvents ContextMenu="grid_ShowContextMenu" />
    <ClientSideEvents BeginCallback="function(s, e) { OnBeginCallback(s,e); }" />
    <ClientSideEvents EndCallback="function(s, e) { OnEndCallback(s,e); }" />
    <StylesEditors>
        <ProgressBar Height="25px">
        </ProgressBar>
    </StylesEditors>

</dxwgv:ASPxGridView>
<asp:SqlDataSource ID="GridSource" runat="server"></asp:SqlDataSource>

А вот обработчик события для BeforePerformDataSelect:

private bool _DataBindingCompleted = false;

    protected void grid_BeforePerformDataSelect(object sender, EventArgs e)
    {
        if (_DataBindCompleted) Grid_PerformDataSelect(sender, e);
    }

    protected override void Grid_PerformDataSelect(bool ClearSelection)
    {
        if (ClearSelection) this.grid.Selection.UnselectAll();

        GridSource.ProviderName = System.Configuration.ConfigurationManager.ConnectionStrings["mysql"].ProviderName;
        GridSource.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["mysql"].ConnectionString;
        SetupSearch();
        //if (this.FilterContext.Count > 0 || !string.IsNullOrEmpty(grid.FilterExpression))
        //{
        string FilterSQL = DevExpressUtils.GetMySQLFilterExpression(grid);
        string OrderBySQL = DevExpressUtils.GetSQLOrderByExpression(grid, "OrderID");
        //FilterSQL = FilterSQL.Replace("[PatientID]", "vwPatients."+ Patient.PRIMARYKEY);
        if (Utils.GetAppSettingBool("MYSQL"))
        {
            GridSource.SelectCommand = this.MP.CurrentUser.GetEOSHeaderSQL(this.FilterContext, FilterSQL, "");
        }
        else
        {
            GridSource.SelectCommand = "";
        }

    }

    protected override void Grid_PerformDataSelect(object sender, EventArgs e)
    {
        bool IsFromParent = this.ClientID.StartsWith(this.MP.GridCallback);
        if (grid.Visible && (!this.Page.IsCallback ||
                ((this.MP.GridCallback == this.grid.ClientID && (this.MP.GridCallbackCommand != "SHOWDETAILROW" || this.IsDetailGrid))
                    || (this.MP.GridCallbackCommand == "SHOWDETAILROW" && IsFromParent)
                    )
                )
           )
        {
            Grid_PerformDataSelect(false);
        }
    }

    protected void grid_AfterPerformCallback(object sender, ASPxGridViewAfterPerformCallbackEventArgs e)
    {
        _DataBindCompleted = true;
        ((DevExpress.Web.ASPxGridView.ASPxGridView)sender).DataBind();
    }

    protected void Page_Init(object sender, EventArgs e)
    {
        grid.DataSource = GridSource;
    }

    protected new void Page_Load(object sender, EventArgs e)
    {
        this.grid.ClientInstanceName = this.grid.ClientID;
        if (!this.IsPostBack)
        {
            _DataBindCompleted = true;
            grid.DataBind();
        }
    }
...