Reset the default rules?

Hi Supports,


Follows Sample, I can set the default rules :

https://blazor.syncfusion.com/demos/query-builder/grid?theme=bootstrap4

If I need to change the rule field , operator, values....etc. What is the best way to set my default rules?


Best Regards!

Jacky



18 Replies 1 reply marked as answer

YA YuvanShankar Arunagiri Syncfusion Team July 11, 2022 06:39 AM UTC

Hi Jacky,


We have checked your reported query and prepared the sample based on your requirement. After the edited the querybuilder rules, you can set the default rule by using the Reset and SetRules method the querybuilder. Please refer the below code snippet.


@using Syncfusion.Blazor.QueryBuilder

@using Syncfusion.Blazor.Grids

@using Syncfusion.Blazor.Buttons

@using ej2_blazor_querybuilderdata

 

<div class="col-lg-12 control-section">

    <SfQueryBuilder @ref="querybuilder" TValue="HardWareDetails" DataSource="@dataSource">

        <QueryBuilderRule Condition="and" Rules="importRules"></QueryBuilderRule>

        <QueryBuilderEvents TValue="HardWareDetails" Created="created" RuleChanged="updateRule"></QueryBuilderEvents>

        <QueryBuilderColumns>

            <QueryBuilderColumn Field="TaskID" Label="Task ID" Type=Syncfusion.Blazor.QueryBuilder.ColumnType.Number></QueryBuilderColumn>

            <QueryBuilderColumn Field="Name" Label="Name" Type=Syncfusion.Blazor.QueryBuilder.ColumnType.String></QueryBuilderColumn>

            <QueryBuilderColumn Field="Category" Label="Category" Type=Syncfusion.Blazor.QueryBuilder.ColumnType.String></QueryBuilderColumn>

            <QueryBuilderColumn Field="SerialNo" Label="Serial No" Type=Syncfusion.Blazor.QueryBuilder.ColumnType.String></QueryBuilderColumn>

            <QueryBuilderColumn Field="InvoiceNo" Label="Invoice No" Type=Syncfusion.Blazor.QueryBuilder.ColumnType.String></QueryBuilderColumn>

            <QueryBuilderColumn Field="Status" Label="Status" Type=Syncfusion.Blazor.QueryBuilder.ColumnType.String></QueryBuilderColumn>

        </QueryBuilderColumns>

    </SfQueryBuilder>

</div>

<div class="col-lg-12 control-section">

    <div class="content-wrapper">

        <div class="row">

            <SfGrid TValue="HardWareDetails" DataSource="@gridData" AllowPaging="true">

                <GridEvents Created="created" TValue="HardWareDetails"></GridEvents>

                <GridColumns>

                    <GridColumn Field=@nameof(HardWareDetails.TaskID) HeaderText="TaskID" TextAlign="TextAlign.Right" Width="120"></GridColumn>

                    <GridColumn Field=@nameof(HardWareDetails.Name) HeaderText="Name" Width="150"></GridColumn>

                    <GridColumn Field=@nameof(HardWareDetails.Category) HeaderText="Category" TextAlign="TextAlign.Right" Width="120"></GridColumn>

                    <GridColumn Field=@nameof(HardWareDetails.SerialNo) HeaderText="Serial No" Width="150"></GridColumn>

                    <GridColumn Field=@nameof(HardWareDetails.InvoiceNo) HeaderText="Invoice No" Width="150"></GridColumn>

                    <GridColumn Field=@nameof(HardWareDetails.Status) HeaderText="Status" Width="150"></GridColumn>

                </GridColumns>

            </SfGrid>

        </div>

    </div>

</div>

<SfButton OnClick="reset">Reset</SfButton>

@code{

    private SfQueryBuilder<HardWareDetails> querybuilder;

    private IEnumerable<HardWareDetails> gridData { get; set; }

    private IEnumerable<HardWareDetails> dataSource { get; set; }

 

    protected override void OnInitialized()

    {

        dataSource = HardWareDetails.GetAllRecords();

    }

    private void created()

    {

        gridData = querybuilder.GetFilteredRecords().ToList().AsEnumerable<HardWareDetails>();

    }

    private List<RuleModel> importRules = new List<RuleModel>()

    {

        new RuleModel { Field = "Category", Label = "Category", Value = "Laptop", Operator = "equal", Type = "String" }

    };

    private List<RuleModel> defaultRule = new List<RuleModel>()

    {

        new RuleModel { Field = "Category", Label = "Category", Value = "Laptop", Operator = "equal", Type = "String" }

    };

    private void updateRule(Syncfusion.Blazor.QueryBuilder.RuleChangeEventArgs args)

    {

        if (querybuilder.GetValidRules().Rules.Count > 0)

        {

            gridData = querybuilder.GetFilteredRecords().ToList().AsEnumerable<HardWareDetails>();

        } else

        {

            gridData = HardWareDetails.GetAllRecords();

        }

        StateHasChanged();

    }

    private void reset()

    {

        querybuilder.Reset();

        querybuilder.SetRules(defaultRule, "and");

        gridData = querybuilder.GetFilteredRecords().ToList().AsEnumerable<HardWareDetails>();

    }

}


Could you please check the above code and get back to us, if you need any further assistance on this. 


Regards,

YuvanShankar A


Attachment: Counter_81f970dc.zip


JA Jacky July 11, 2022 02:26 PM UTC

Hi  YuvanShankar ,


It's worked.


Thank you  again.

Jacky



YA YuvanShankar Arunagiri Syncfusion Team July 12, 2022 03:52 AM UTC

Hi Jacky,


We are happy to hear that your requirement has been fulfilled. Please get back to us if you need any further assistance on this.


Regards,

YuvanShankar A



JA Jacky July 13, 2022 02:35 AM UTC

Hi  YuvanShankar ,


Another Issure  when I delete one condition of  the rule and got a exception,

follows is my steps and capture the messages.


Please kindly help.


Best Regards!

Jacky




warn: Microsoft.AspNetCore.Components.Server.Circuits.RemoteRenderer[0]

      Unhandled exception rendering component: Object reference not set to an instance of an object.System.NullReferenceException: Object reference not set to an instance of an object.

   at Syncfusion.Blazor.QueryBuilder.Internal.QueryBuilderRules`1.RemoveClick()

   at Microsoft.AspNetCore.Components.ComponentBase.CallStateHasChangedOnAsyncCompletion(Task task)

   at Syncfusion.Blazor.Internal.SfBaseUtils.InvokeEvent[T](Object eventFn, T eventArgs)

   at Syncfusion.Blazor.Buttons.SfButton.OnClickHandler(MouseEventArgs args)

   at Microsoft.AspNetCore.Components.ComponentBase.CallStateHasChangedOnAsyncCompletion(Task task)

   at Microsoft.AspNetCore.Components.RenderTree.Renderer.GetErrorHandledTask(Task taskToHandle, ComponentState owningComponentState)

erro: Microsoft.AspNetCore.Components.Server.Circuits.CircuitHost[0]

      Unhandled exception in circuit 'U9wHYu5QqwdGEBFEzmhBEiEm2nn-2BXXWnzPm1OYZKc'.System.NullReferenceException: Object reference not set to an instance of an object.

   at Syncfusion.Blazor.QueryBuilder.Internal.QueryBuilderRules`1.RemoveClick()

   at Microsoft.AspNetCore.Components.ComponentBase.CallStateHasChangedOnAsyncCompletion(Task task)

   at Syncfusion.Blazor.Internal.SfBaseUtils.InvokeEvent[T](Object eventFn, T eventArgs)

   at Syncfusion.Blazor.Buttons.SfButton.OnClickHandler(MouseEventArgs args)

   at Microsoft.AspNetCore.Components.ComponentBase.CallStateHasChangedOnAsyncCompletion(Task task)

   at Microsoft.AspNetCore.Components.RenderTree.Renderer.GetErrorHandledTask(Task taskToHandle, ComponentState owningComponentState)



YA YuvanShankar Arunagiri Syncfusion Team July 14, 2022 09:23 AM UTC

Hi Jacky,


We unable to replicate the issue in our end. For your reference, please refer the below attached sample and video demonstration.

If you are still facing issue, please share the below details.


  • Share the issue reproducible sample or replicate the issue in our sample.

  • Share the video demonstration.


Please provide the above requested information, based on that we will check and provide you a better solution quickly.


Regards,

YuvanShankar A


Attachment: BlazorApp1net6_2e949e9.zip


JA Jacky July 15, 2022 05:19 AM UTC

Hi  YuvanShankar ,


I have add sample to the project you gave and include  video demonstration to  replicate the issue.

, please refer the below attached file. 


Please kindly help.


Thanks!

Jacky




Attachment: BlazorApp1net6_20220715_7408512.rar


YA YuvanShankar Arunagiri Syncfusion Team July 19, 2022 01:16 PM UTC

Hi Jacky,


Sorry for the delay. We are validating your query and will update you the details on or before 22th July 2022.


Regards,

YuvanShankar A



JA Jacky July 20, 2022 01:17 AM UTC

Hi  YuvanShankar,


Thank you for your help. Looking forward to your solution.


Best Regards!

Jacky



JA Jacky replied to YuvanShankar Arunagiri August 5, 2022 01:43 AM UTC

Hi  YuvanShankar,


Did you have any best practice for this issure? 

Thanks!


Best Regards!

Jacky



YA YuvanShankar Arunagiri Syncfusion Team August 9, 2022 10:08 AM UTC

Hi Jacky,


We regret for the inconvenience.


We have checked your reported query and found an issue in your provided sample. please refer the below code snippet to resolve this issue. Refreshing the component while ruleChange is reason for script error.


[BZSE51ViewModel.cs]:

public async Task updateRule(RuleChangeEventArgs args)

    {

        //For GetFilteredRecords()

        if (Querybuilder.GetValidRules().Rules.Count > 0)

        {

            gridData = (IEnumerable<POHeader>)Querybuilder.GetFilteredRecords();

        }

        else

        {

            //DataRequestResult<POHeader> adaptorModelObjects = await CurrentService.POHeaderList();

            //gridData = adaptorModelObjects.Result;

            gridData = dataSource;

        }

        //await Task.Delay(100);// 使用延遲,讓 Header 的資料綁定可以成功

        //await thisView.NeedRefreshAsync();

    }


Could you please check the above code and get back to us, if you need any further assistance on this. 


Regards,

YuvanShankar A


Marked as answer

JA Jacky August 11, 2022 01:46 AM UTC

Hi YuvanShankar,


It's worked , sorry for my code Issue.

Thank you for great support again!


Regards!

Jacky





YA YuvanShankar Arunagiri Syncfusion Team August 11, 2022 05:29 AM UTC

You are welcome, Jacky. We are happy to hear that your requirement has been fulfilled. Please get back to us if you need any further assistance on this.



JA Jacky October 18, 2022 02:48 AM UTC

Hi YuvanShankar,


Another  further assistance for the same Sample.

If my datasource has changed and refreshed again. how can I sync change to the Querybuilder and DataGrid.

Now I must  manual select the Condition again, it will be refreshed.


Thanks!

Jacky



YA YuvanShankar Arunagiri Syncfusion Team October 19, 2022 11:03 AM UTC

Hi Jacky,


We have checked your reported query and same reset method which was used in your sample is used for connecting the changed data source for query builder and grid.

private void reset()

    {

        querybuilder.Reset();

        querybuilder.SetRules(defaultRule, "and");

        gridData = querybuilder.GetFilteredRecords().ToList().AsEnumerable<HardWareDetails>();

    }


Please refer the simple method for your requirement.

private void afterChangedData()

    {

        dataSource = changedData;

        querybuilder.Reset();

        //if you have default rule for change data then you can use below line

        querybuilder.SetRules(defaultRule, "and");

        gridData = querybuilder.GetFilteredRecords().ToList().AsEnumerable<HardWareDetails>();

    }


Could you please check the attached sample file and get back to us, if you need any further assistance on this.


Regards, 

YuvanShankar A



JA Jacky October 20, 2022 06:56 AM UTC

Hi  YuvanShankar ,


Thank you support again.

I changed my sample to replicate the issue.By Step1 default loading will show 63 records.Step2 Click the ChangeRecord button will trigger event to change the datasource to 28  records than reset Querybuilder rules, but it still display 63 records.


Attach my sample sample zip.


Best Regards!

Jacky



Attachment: BlazorApp1net6_20221020_8ceb9eaa.zip


YA YuvanShankar Arunagiri Syncfusion Team October 21, 2022 11:39 AM UTC

Hi Jacky,


We have checked your reported query and in ChangeDataSource method we have changed the variable dataSource, but it takes some time to reflect in query builder data source. Please refer the below code snippet to achieve your requirement.

[BZSE51View.razor]:

public void Reset()

    {

        OrderHeadersQuerybuilder.Reset();

        OrderHeadersQuerybuilder.DataSource = ViewModel.dataSource;

        StateHasChanged();

    }


Could you please check the sample and get back to us, if you need any further assistance on this.


Regards, 

YuvanShankar A



JA Jacky October 22, 2022 01:15 PM UTC

Hi YuvanShankar,


It's worked.

I think the "Integration with DataGrid in QueryBuilder" is more suitable for the datasource is all retrieved to frontend and filter by QueryBuilder.


If the datasource is changed by CRUD.Sync data for the QueryBuilder and DataGrid data need more code to concerned.


Thank for your great help!


Best Regards!

Jacky



YA YuvanShankar Arunagiri Syncfusion Team October 26, 2022 05:33 AM UTC

You are welcome, Jacky. We are happy to hear that your requirement has been fulfilled. Please get back to us if you need any further assistance on this.


Best Regards,

YuvanShankar A


If that post is helpful, please consider accepting it as the solution so that other members can locate it more quickly.


Loader.
Up arrow icon