[CLOSED] Drag and Drop from GridPanel to GridPanel performance issue

Page 1 of 2 12 LastLast
  1. #1

    [CLOSED] Drag and Drop from GridPanel to GridPanel performance issue

    Hi,

    I'm working on implementing a pattern allowing the user to drag and drop one or more items from one GridPanel to another. It's similar to the paradigm discussed in http://forums.ext.net/showthread.php...ogrammatically except that this time around I require a multi-column list view. MultiSelect doesn't provide that.

    I started with the example at https://examples1.ext.net/#/DragDrop...Grid_to_Grid1/.

    Data Stores have 7 String fields for both grids having 6 columns + 1 image column. The left Store data source fetches slightly over a thousand records, while the right one only a few dozens. Drag and drop works relatively fast from the right to the left. However, left to the right hangs if I grab hundreds of records. It works with a few rows but noticeably slow. I'm curious if performance optimization can be done for my code that does records addition/removal to the stores. It seems like the call to getSelectionModel().getSelections() is the bottleneck. Another point of concern is that Store listeners don't get suppressed for some reason. Please take a look at the code fragments below. I will try to provide a fulsome sample if you need more information.

    <%@ Page Language="C#" %>
    <%@ Register Assembly="Ext.Net" Namespace="Ext.Net" TagPrefix="ext" %>
    <%@ Import Namespace="System.Data" %>
    <script runat="server">
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!X.IsAjaxRequest)
            {
                DataTable leftAddress = GetAddress();     // Returns over 1,000 records
                DataTable rightAddress = GetAddress();     // Returns a few dozens of records
    
                this.StoreLeft.DataSource = leftAddress;
                this.StoreRight.DataSource = rightAddress;
    
                this.StoreLeft.DataBind();
                this.StoreRight.DataBind();
            }
        }
    </script>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head id="Head1" runat="server">
        <title>Overview of MultiSelect - Ext.NET Examples</title>
        <ext:XScript ID="XScript1" runat="server">
        <script type="text/javascript" language="javascript">
            var recordIconRenderer = function (value, metadata, record) {
                var iconSrc = Ext.net.ResourceMgr.getIconUrl("Note");
    
                return String.format("<img src='{0}' />", iconSrc);
            };
    
            var notifyDropToLeft = function (ddSource, e, data) {
                var records=GridPanelRight.getSelectionModel().getSelections();
                
                ddSource.grid.store.suspendEvents(true);
                #{StoreLeft}.suspendEvents(true);
    
                ddSource.grid.store.remove(records);
                #{StoreLeft}.add(records);
                
                ddSource.grid.store.resumeEvents();
                #{StoreLeft}.resumeEvents();
                
                return true;
            };
            
            var notifyDropToRight = function (ddSource, e, data) {
                var records=GridPanelLeft.getSelectionModel().getSelections();
                
                ddSource.grid.store.suspendEvents(true);
                #{StoreRight}.suspendEvents(true);
    
                ddSource.grid.store.remove(records);
                #{StoreRight}.add(records);
    
                ddSource.grid.store.resumeEvents();
                #{StoreRight}.resumeEvents();
                
                return true;
            };
        </script>
        </ext:XScript>
    </head>
    <body>
    <form id="Form1" runat="server">
        <ext:ResourceManager ID="ResourceManager1" runat="server" />
        <ext:Store ID="StoreLeft" runat="server">
            <Reader>
                <ext:JsonReader IDProperty="AddressID">
                    <Fields>
                        <ext:RecordField Name="AddressID" SortDir="ASC" />
                        <ext:RecordField Name="Line1" />
                        <ext:RecordField Name="Line2" />
                        <ext:RecordField Name="City" />
                        <ext:RecordField Name="ZIP" />
                        <ext:RecordField Name="Province" />
                        <ext:RecordField Name="Country" />
                    </Fields>
                </ext:JsonReader>
            </Reader>
            <Listeners>
                <Remove Handler="alert('Left');" />
            </Listeners>
        </ext:Store>
        <ext:Store ID="StoreRight" runat="server">
            <Reader>
                <ext:JsonReader IDProperty="AddressID">
                    <Fields>
                        <ext:RecordField Name="AddressID" SortDir="ASC" />
                        <ext:RecordField Name="Line1" />
                        <ext:RecordField Name="Line2" />
                        <ext:RecordField Name="City" />
                        <ext:RecordField Name="ZIP" />
                        <ext:RecordField Name="Province" />
                        <ext:RecordField Name="Country" />
                    </Fields>
                </ext:JsonReader>
            </Reader>
            <Listeners>
                <Remove Handler="alert('Right');" />
            </Listeners>
        </ext:Store>
    
        <ext:GridPanel ID="GridPanelLeft" runat="server" EnableDragDrop="true" DDGroup="GridPanelRightDDGroup"
            Width="560" Height="250" StoreID="StoreLeft" Frame="false" Border="true" StripeRows="true"
            TrackMouseOver="true" ActiveIndex="0"
            SelectionMemory="Enabled" Split="true" AutoScroll="true">
            <ColumnModel runat="server" ID="ColumnModel1">
                <Columns>
                    <ext:Column ColumnID="IconColumn" MenuDisabled="true" Sortable="false" Resizable="false"
                        Hideable="false" Width="26">
                        <Renderer Fn="recordIconRenderer" />
                    </ext:Column>
                   <ext:Column ColumnID="AddressID" Header="AddressID" DataIndex="AddressID" Hidden="true"/>
                    <ext:Column ColumnID="Line1" Header="Line1" DataIndex="Line1"
                        Width="140" />
                    <ext:Column ColumnID="Line2" Header="Line2" DataIndex="Line2"
                        Width="130" />
                    <ext:Column ColumnID="City" Header="City" DataIndex="City" Width="80" />
                    <ext:Column ColumnID="ZIP" Header="ZIP" DataIndex="ZIP" Width="80">
                    </ext:Column>
                    <ext:Column ColumnID="Province" Header="Province" DataIndex="Province"
                        Width="80" />
                </Columns>
            </ColumnModel>
            <SelectionModel>
                <ext:RowSelectionModel runat="server" SingleSelect="false" ID="RowSelectionModel1">
                </ext:RowSelectionModel>
            </SelectionModel>
            <LoadMask ShowMask="true" />
        </ext:GridPanel>
    
        <ext:GridPanel ID="GridPanelRight" runat="server" EnableDragDrop="true" DDGroup="GridPanelLeftDDGroup"
            Width="560" Height="250" StoreID="StoreRight" Frame="false" Border="true" StripeRows="true"
            TrackMouseOver="true" ActiveIndex="0"
            SelectionMemory="Enabled" Split="true" AutoScroll="true">
            <ColumnModel runat="server" ID="ColumnModel1">
                <Columns>
                    <ext:Column ColumnID="IconColumn" MenuDisabled="true" Sortable="false" Resizable="false"
                        Hideable="false" Width="26">
                        <Renderer Fn="recordIconRenderer" />
                    </ext:Column>
                   <ext:Column ColumnID="AddressID" Header="AddressID" DataIndex="AddressID" Hidden="true"/>
                    <ext:Column ColumnID="Line1" Header="Line1" DataIndex="Line1"
                        Width="140" />
                    <ext:Column ColumnID="Line2" Header="Line2" DataIndex="Line2"
                        Width="130" />
                    <ext:Column ColumnID="City" Header="City" DataIndex="City" Width="80" />
                    <ext:Column ColumnID="ZIP" Header="ZIP" DataIndex="ZIP" Width="80">
                    </ext:Column>
                    <ext:Column ColumnID="Province" Header="Province" DataIndex="Province"
                        Width="80" />
                </Columns>
            </ColumnModel>
            <SelectionModel>
                <ext:RowSelectionModel runat="server" SingleSelect="false" ID="RowSelectionModel1"></ext:RowSelectionModel>
            </SelectionModel>
            <LoadMask ShowMask="true" />
        </ext:GridPanel>
    
        <ext:DropTarget ID="DropTarget1" runat="server" Target="={GridPanelLeft.view.scroller.dom}"
            Group="GridPanelLeftDDGroup">
            <NotifyDrop Fn="notifyDropToLeft" />
        </ext:DropTarget>
        <ext:DropTarget ID="DropTarget2" runat="server" Target="={GridPanelRight.view.scroller.dom}"
            Group="GridPanelRightDDGroup">
            <NotifyDrop Fn="notifyDropToRight" />
        </ext:DropTarget>
    </form>
    </body>
    </html>
    Last edited by Daniil; Nov 09, 2012 at 3:32 PM. Reason: [CLOSED]
  2. #2
    Hello!

    Try this one:

    <script runat="server">
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!X.IsAjaxRequest)
            {
                this.StoreLeft.DataSource = GetAddress(1000);
     
                this.StoreLeft.DataBind();
                this.StoreRight.DataBind();
            }
        }
        
        private static IEnumerable<object> GetAddress(int count)
        {
            for (int i = 0; i < count; i++) {
                yield return
                    new {
                        AddressID = "AddressID_" + i,
                        Line1 = "Line1_" + i,
                        Line2 = "Line2_" + i,
                        City = "City_" + i,
                        ZIP = "M6Y OP9",
                        Province = "Province",
                        Country = "Country"
                    };
            }
        }
    </script>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head id="Head1" runat="server">
        <title>Overview of MultiSelect - Ext.NET Examples</title>
        <ext:XScript ID="XScript1" runat="server">
        <script type="text/javascript" language="javascript">
            var recordIconRenderer = function (value, metadata, record) {
                var iconSrc = Ext.net.ResourceMgr.getIconUrl("Note");
     
                return String.format("<img src='{0}' />", iconSrc);
            };
     
            var notifyDropToLeft = function (ddSource, e, data) {
                var records = data.selections;
                 
                ddSource.grid.store.suspendEvents(false);
                #{StoreLeft}.suspendEvents(false);
     
                ddSource.grid.store.remove(records);
                #{StoreLeft}.add(records);
                 
                ddSource.grid.store.resumeEvents();
                #{StoreLeft}.resumeEvents();
                
                #{GridPanelLeft}.getView().refresh();
                #{GridPanelRight}.getView().refresh();
                 
                return true;
            };
             
            var notifyDropToRight = function (ddSource, e, data) {
                var records = data.selections;
                 
                ddSource.grid.store.suspendEvents(false);
                #{StoreRight}.suspendEvents(false);
     
                ddSource.grid.store.remove(records);
                #{StoreRight}.add(records);
     
                ddSource.grid.store.resumeEvents();
                #{StoreRight}.resumeEvents();
                
                #{GridPanelLeft}.getView().refresh();
                #{GridPanelRight}.getView().refresh();
                 
                return true;
            };
        </script>
        </ext:XScript>
    </head>
    <body>
    <form id="Form1" runat="server">
        <ext:ResourceManager ID="ResourceManager1" runat="server" SourceFormatting="True" ScriptMode="Debug" />
        <ext:Store ID="StoreLeft" runat="server">
            <Reader>
                <ext:JsonReader IDProperty="AddressID">
                    <Fields>
                        <ext:RecordField Name="AddressID" SortDir="ASC" />
                        <ext:RecordField Name="Line1" />
                        <ext:RecordField Name="Line2" />
                        <ext:RecordField Name="City" />
                        <ext:RecordField Name="ZIP" />
                        <ext:RecordField Name="Province" />
                        <ext:RecordField Name="Country" />
                    </Fields>
                </ext:JsonReader>
            </Reader>
            <Listeners>
                <%--<Remove Handler="alert('Left');" />--%>
            </Listeners>
        </ext:Store>
        <ext:Store ID="StoreRight" runat="server">
            <Reader>
                <ext:JsonReader IDProperty="AddressID">
                    <Fields>
                        <ext:RecordField Name="AddressID" SortDir="ASC" />
                        <ext:RecordField Name="Line1" />
                        <ext:RecordField Name="Line2" />
                        <ext:RecordField Name="City" />
                        <ext:RecordField Name="ZIP" />
                        <ext:RecordField Name="Province" />
                        <ext:RecordField Name="Country" />
                    </Fields>
                </ext:JsonReader>
            </Reader>
            <Listeners>
                <%--<Remove Handler="alert('Right');" />--%>
            </Listeners>
        </ext:Store>
     
        <ext:GridPanel ID="GridPanelLeft" runat="server" EnableDragDrop="true" DDGroup="GridPanelRightDDGroup"
            Width="560" Height="250" StoreID="StoreLeft" Frame="false" Border="true" StripeRows="true"
            TrackMouseOver="true" ActiveIndex="0"
            SelectionMemory="Enabled" Split="true" AutoScroll="true">
            <ColumnModel runat="server">
                <Columns>
                    <ext:Column ColumnID="IconColumn" MenuDisabled="true" Sortable="false" Resizable="false"
                        Hideable="false" Width="26">
                        <Renderer Fn="recordIconRenderer" />
                    </ext:Column>
                   <ext:Column ColumnID="AddressID" Header="AddressID" DataIndex="AddressID" Hidden="true"/>
                    <ext:Column ColumnID="Line1" Header="Line1" DataIndex="Line1"
                        Width="140" />
                    <ext:Column ColumnID="Line2" Header="Line2" DataIndex="Line2"
                        Width="130" />
                    <ext:Column ColumnID="City" Header="City" DataIndex="City" Width="80" />
                    <ext:Column ColumnID="ZIP" Header="ZIP" DataIndex="ZIP" Width="80">
                    </ext:Column>
                    <ext:Column ColumnID="Province" Header="Province" DataIndex="Province"
                        Width="80" />
                </Columns>
            </ColumnModel>
            <SelectionModel>
                <ext:RowSelectionModel runat="server" SingleSelect="false">
                </ext:RowSelectionModel>
            </SelectionModel>
            <LoadMask ShowMask="true" />
        </ext:GridPanel>
     
        <ext:GridPanel ID="GridPanelRight" runat="server" EnableDragDrop="true" DDGroup="GridPanelLeftDDGroup"
            Width="560" Height="250" StoreID="StoreRight" Frame="false" Border="true" StripeRows="true"
            TrackMouseOver="true" ActiveIndex="0"
            SelectionMemory="Enabled" Split="true" AutoScroll="true">
            <ColumnModel runat="server" ID="ColumnModel1">
                <Columns>
                    <ext:Column ColumnID="IconColumn" MenuDisabled="true" Sortable="false" Resizable="false"
                        Hideable="false" Width="26">
                        <Renderer Fn="recordIconRenderer" />
                    </ext:Column>
                   <ext:Column ColumnID="AddressID" Header="AddressID" DataIndex="AddressID" Hidden="true"/>
                    <ext:Column ColumnID="Line1" Header="Line1" DataIndex="Line1"
                        Width="140" />
                    <ext:Column ColumnID="Line2" Header="Line2" DataIndex="Line2"
                        Width="130" />
                    <ext:Column ColumnID="City" Header="City" DataIndex="City" Width="80" />
                    <ext:Column ColumnID="ZIP" Header="ZIP" DataIndex="ZIP" Width="80">
                    </ext:Column>
                    <ext:Column ColumnID="Province" Header="Province" DataIndex="Province"
                        Width="80" />
                </Columns>
            </ColumnModel>
            <SelectionModel>
                <ext:RowSelectionModel runat="server" SingleSelect="false" ID="RowSelectionModel1"></ext:RowSelectionModel>
            </SelectionModel>
            <LoadMask ShowMask="true" />
        </ext:GridPanel>
     
        <ext:DropTarget ID="DropTarget1" runat="server" Target="={GridPanelLeft.view.scroller.dom}"
            Group="GridPanelLeftDDGroup">
            <NotifyDrop Fn="notifyDropToLeft" />
        </ext:DropTarget>
        <ext:DropTarget ID="DropTarget2" runat="server" Target="={GridPanelRight.view.scroller.dom}"
            Group="GridPanelRightDDGroup">
            <NotifyDrop Fn="notifyDropToRight" />
        </ext:DropTarget>
    </form>
    </body>
    </html>
  3. #3
    Thanks much Baidaly, that's alot faster than before. One thing I noticed after the drag-and-drop is that the view of the grid where the items were dragged from remains unrefreshed, i.e. the vertical scroll bar remains in place with no rows present. What would be the fix?
  4. #4
    Be careful with ".suspendEvents(false)". It means that no Store events will be fired. But, I think, it is a single way to improve performance in your case.

    Hmm, an interesting issue with a scrollbar. We are investigating.

    Here is a simplified sample to reproduce.

    Steps are:

    1. Scroll at the bottom or about middle
    2. Select a row
    3. Click the removeAll Button => a scrollbar doesn't disappear

    Interesting the issue is not reproducible without #1 or #2 steps.

    Example
    <%@ Page Language="C#" %>
    
    <%@ Register Assembly="Ext.Net" Namespace="Ext.Net" TagPrefix="ext" %>
    
    <script runat="server">
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!X.IsAjaxRequest)
            {
                Store store = this.GridPanel1.GetStore();
                store.DataSource = new object[] 
                { 
                    new object[] { "test1" },
                    new object[] { "test2" },
                    new object[] { "test3" },
                    new object[] { "test4" },
                    new object[] { "test5" },
                    new object[] { "test6" },
                    new object[] { "test7" },
                    new object[] { "test8" },
                    new object[] { "test9" }
                };
                store.DataBind();
            }
        }
    </script>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>Ext.NET Example</title>
    
        <script type="text/javascript">
            var removeAll = function () {
                var store = GridPanel1.getStore();
                
                store.suspendEvents(false); 
                store.remove(store.getAllRange());
                store.resumeEvents();
    
                GridPanel1.getView().refresh();
    
            };
        </script>
    </head>
    <body>
        <form runat="server">
            <ext:ResourceManager runat="server" />
    
            <ext:GridPanel 
                ID="GridPanel1" 
                runat="server" 
                Height="100" 
                Width="200">
                <Store>
                    <ext:Store runat="server">
                        <Reader>
                            <ext:ArrayReader>
                                <Fields>
                                    <ext:RecordField Name="test" />
                                </Fields>
                            </ext:ArrayReader>
                        </Reader>
                    </ext:Store>
                </Store>
                <ColumnModel runat="server">
                    <Columns>
                        <ext:Column Header="Test" DataIndex="test" />
                    </Columns>
                </ColumnModel>
            </ext:GridPanel>
    
            <ext:Button runat="server" Text="remove all">
                <Listeners>
                    <Click Fn="removeAll" />
                </Listeners>
            </ext:Button>
        </form>
    </body>
    </html>
  5. #5
    Thanks Daniil,

    Please keep me in the loop. BTW, what's the most optimal way of selecting all the records in the Store? Is it

    store.getAllRange();
    or

    // No parameters
    store.getRange();
    I've noticed that getAllRange() isn't documented by Sencha at http://docs.sencha.com/ext-js/3-4/#!/api/Ext.data.Store. Is it just a random omission on their part or does it happen all the time, from your experience with them?
  6. #6
    Hi guys,

    Below is the complete code sample utilizing the drag-and-drop paradigm doubled up by the button controls. Now, with the tune-up you've suggested, performance of sizable drag-and-drop operations seems OK. What's strangely lagging behind is moving one or several items across the grid panels using the buttons. Please select one or more items anywhere on either grid and hit the > or < button to observe the issue. I'm not sure what makes it so inefficient. Could it be the call to getSelectionModel().getSelections() ?

    <%@ Page Language="C#" %>
    
    <%@ Register Assembly="Ext.Net" Namespace="Ext.Net" TagPrefix="ext" %>
    <%@ Import Namespace="System.Data" %>
    <script runat="server">
        
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!X.IsAjaxRequest)
            {
                this.StoreLeft.DataSource = GetAddress(1000);
                this.StoreLeft.DataBind();
                this.StoreRight.DataBind();
                
                this.ButtonOneRight.Disabled = true;
                this.ButtonOneLeft.Disabled = true;
            }
        }
    
        private static IEnumerable<object> GetAddress(int count)
        {
            for (int i = 0; i < count; i++)
            {
                yield return
                    new
                    {
                        AddressID = "AddressID_" + i,
                        Address1 = "Line1_" + i,
                        AdressLine2 = "Line2_" + i,
                        City = "City_" + i,
                        ZIP = "M6Y OP9",
                        Province = "Province",
                        Country = "Country"
                    };
            }
        }
    </script>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head id="Head1" runat="server">
        <title>Overview of MultiSelect - Ext.NET Examples</title>
        <ext:XScript ID="XScript1" runat="server">
        <script type="text/javascript" language="javascript">
            var recordIconRenderer = function (value, metadata, record) {
                var iconSrc = Ext.net.ResourceMgr.getIconUrl("Note");
    
                return String.format("<img src='{0}' />", iconSrc);
            };
                         
            var fromLeftToRight = function () {
                fromTo(#{GridPanelLeft}, #{GridPanelRight});
                #{ButtonOneRight}.disable();
                #{ButtonAllLeft}.enable();
    
                if(#{GridPanelLeft}.store.getTotalCount()==0)
                    #{ButtonAllRight}.disable();
            };
                   
            var fromRightToLeft = function () {
                fromTo(#{GridPanelRight}, #{GridPanelLeft});
                #{ButtonOneLeft}.disable();
                #{ButtonAllRight}.enable();
    
                if(#{GridPanelRight}.store.getTotalCount()==0)
                    #{ButtonAllLeft}.disable();
            };
                   
            var allFromLeftToRight = function () {
                moveAll(#{GridPanelLeft}, #{GridPanelRight});
                #{ButtonOneRight}.disable();
                #{ButtonAllRight}.disable();
                #{ButtonAllLeft}.enable();
            };
     
            var allFromRightToLeft = function () {
                moveAll(#{GridPanelRight}, #{GridPanelLeft});
                #{ButtonOneLeft}.disable();
                #{ButtonAllLeft}.disable();
                #{ButtonAllRight}.enable();
            };
     
            var moveAll = function (fromGrid, toGrid) {
                // var records = fromGrid.store.getRange();
                var records = fromGrid.store.getAllRange();
                fromGrid.store.suspendEvents(false);
                toGrid.store.suspendEvents(false);
                  
                fromGrid.store.removeAll(true);
                toGrid.store.add(records);
                  
                fromGrid.store.resumeEvents();
                toGrid.store.resumeEvents();
                  
                fromGrid.getView().refresh();
                toGrid.getView().refresh();
    			
    			return true;
            }
                   
            var fromTo = function (fromGrid, toGrid) {
                var records = fromGrid.getSelectionModel().getSelections();
     
                fromGrid.store.suspendEvents(false);
                toGrid.store.suspendEvents(false);
    
                fromGrid.store.remove(records);
                toGrid.store.add(records);
    
                fromGrid.store.resumeEvents();
                toGrid.store.resumeEvents();
    
                fromGrid.getView().refresh();
                toGrid.getView().refresh();
    			
    			return true;
            };
    
            var notifyDropToLeft = function (ddSource, e, data) {
                var records=data.selections;
    			
                ddSource.grid.store.suspendEvents(false);
                #{StoreLeft}.suspendEvents(false);
    
                ddSource.grid.store.remove(records);
                #{StoreLeft}.add(records);
                
                ddSource.grid.store.resumeEvents();
                #{StoreLeft}.resumeEvents();
    
                #{ButtonOneLeft}.disable();
                #{ButtonAllRight}.enable();
    
                if(#{GridPanelRight}.store.getTotalCount()==0)
                    #{ButtonAllLeft}.disable();
    
                #{GridPanelLeft}.getView().refresh();
                #{GridPanelRight}.getView().refresh();
    			
    			return true;
    		};
    		
    		var notifyDropToRight = function (ddSource, e, data) {
                var records=data.selections;
    			
                ddSource.grid.store.suspendEvents(false);
                #{StoreRight}.suspendEvents(false);
    
                ddSource.grid.store.remove(records);
                #{StoreRight}.add(records);
    
                ddSource.grid.store.resumeEvents();
                #{StoreRight}.resumeEvents();
    
                #{ButtonOneRight}.disable();
                #{ButtonAllLeft}.enable();
    
                if(#{GridPanelLeft}.store.getTotalCount()==0)
                    #{ButtonAllRight}.disable();
    
                #{GridPanelLeft}.getView().refresh();
                #{GridPanelRight}.getView().refresh();
    			
    			return true;
    		};
        </script>
        </ext:XScript>
    </head>
    <body>
        <form id="Form1" runat="server">
        <ext:ResourceManager ID="ResourceManager1" runat="server" />
        <ext:Store ID="StoreLeft" runat="server">
            <Reader>
                <ext:JsonReader IDProperty="AddressID">
                    <Fields>
                        <ext:RecordField Name="AddressID" SortDir="ASC" />
                        <ext:RecordField Name="Address1" />
                        <ext:RecordField Name="Address2" />
                        <ext:RecordField Name="City" />
                        <ext:RecordField Name="ZIP" />
                        <ext:RecordField Name="Province" />
                        <ext:RecordField Name="Country" />
                    </Fields>
                </ext:JsonReader>
            </Reader>
            <Listeners>
                <Remove Handler="#{ButtonAllLeft}.enable();
                            #{ButtonOneRight}.disable();
                            #{ButtonOneLeft}.disable();
                            if(this.getTotalCount()==0)
                                #{ButtonAllRight}.disable();
                            else
                                #{ButtonAllRight}.enable();" />
            </Listeners>
        </ext:Store>
        <ext:Store ID="StoreRight" runat="server">
            <Reader>
                <ext:JsonReader IDProperty="AddressID">
                    <Fields>
                        <ext:RecordField Name="AddressID" SortDir="ASC" />
                        <ext:RecordField Name="Address1" />
                        <ext:RecordField Name="Address2" />
                        <ext:RecordField Name="City" />
                        <ext:RecordField Name="ZIP" />
                        <ext:RecordField Name="Province" />
                        <ext:RecordField Name="Country" />
                    </Fields>
                </ext:JsonReader>
            </Reader>
            <Listeners>
                <Remove Handler="#{ButtonAllRight}.enable();
                            #{ButtonOneRight}.disable();
                            #{ButtonOneLeft}.disable();
                            if(this.getTotalCount()==0)
                                #{ButtonAllLeft}.disable();
                            else
                                #{ButtonAllLeft}.enable();" />
            </Listeners>
        </ext:Store>
        <ext:Panel ID="Panel13" runat="server" Title="Drag/Drop (Insert Mode)" Padding="10">
            <Items>
                <ext:TableLayout ID="TableLayout5" runat="server" Columns="3">
                    <Cells>
                        <ext:Cell>
                            <ext:Panel ID="Panel14" runat="server" Layout="FitLayout" Border="true" BodyStyle="height: 260px;"
                                Title="Available Items">
                                <Items>
                                    <ext:GridPanel ID="GridPanelLeft" runat="server" EnableDragDrop="true" DDGroup="GridPanelRightDDGroup"
                                        Width="560" Height="250" StoreID="StoreLeft" Frame="false" Border="true" StripeRows="true"
                                        TrackMouseOver="true" ActiveIndex="0" SelectionMemory="Enabled" Split="true"
                                        AutoScroll="true">
                                        <ColumnModel runat="server" ID="ColumnModel1">
                                            <Columns>
                                                <ext:Column ColumnID="IconColumn" MenuDisabled="true" Sortable="false" Resizable="false"
                                                    Hideable="false" Width="26">
                                                    <Renderer Fn="recordIconRenderer" />
                                                </ext:Column>
                                                <ext:Column ColumnID="AddressID" Header="AddressID" DataIndex="AddressID"
                                                    Hidden="true" />
                                                <ext:Column ColumnID="Address1" Header="Address Line1" DataIndex="Address1"
                                                    Width="140" />
                                                <ext:Column ColumnID="Address2" Header="Address Line2" DataIndex="Address2"
                                                    Width="130" />
                                                <ext:Column ColumnID="City" Header="City" DataIndex="City" Width="80" />
                                                <ext:Column ColumnID="ZIP" Header="Postal Code" DataIndex="ZIP" Width="80">
                                                </ext:Column>
                                                <ext:Column ColumnID="Province" Header="Province" DataIndex="Province"
                                                    Width="80" />
                                            </Columns>
                                        </ColumnModel>
                                        <SelectionModel>
                                            <ext:RowSelectionModel runat="server" SingleSelect="false" ID="RowSelectionModel1">
                                            </ext:RowSelectionModel>
                                        </SelectionModel>
                                        <LoadMask ShowMask="true" />
                                        <Listeners>
                                            <RowClick Handler="#{ButtonOneRight}.enable();" />
                                            <RowDblClick Handler="fromLeftToRight();" />
                                        </Listeners>
                                    </ext:GridPanel>
                                </Items>
                            </ext:Panel>
                        </ext:Cell>
                        <ext:Cell>
                            <ext:Panel ID="Panel1" runat="server" Border="false" Layout="VBoxLayout" BodyStyle="height: 300px;">
                                <Defaults>
                                    <ext:Parameter Name="margins" Value="5 0 5 0" Mode="Value" />
                                </Defaults>
                                <LayoutConfig>
                                    <ext:VBoxLayoutConfig Padding="5" Align="Center" Pack="Center" />
                                </LayoutConfig>
                                <Items>
                                    <ext:Button ID="ButtonOneRight" runat="server" Icon="ResultsetNext" Width="30">
                                        <Listeners>
                                            <Click Handler="fromLeftToRight();" />
                                        </Listeners>
                                        <ToolTips>
                                            <ext:ToolTip ID="ToolTip4" runat="server" Title="Add" Html="<nobr>Add Selected Items</nobr>" />
                                        </ToolTips>
                                    </ext:Button>
                                    <ext:Button ID="ButtonAllRight" runat="server" Icon="ResultsetLast" Width="30">
                                        <Listeners>
                                            <Click Handler="allFromLeftToRight();" />
                                        </Listeners>
                                        <ToolTips>
                                            <ext:ToolTip ID="ToolTip3" runat="server" Title="Add all" Html="<nobr>Add All Items</nobr>" />
                                        </ToolTips>
                                    </ext:Button>
                                    <ext:Button ID="ButtonOneLeft" runat="server" Icon="ResultsetPrevious" Width="30">
                                        <Listeners>
                                            <Click Handler="fromRightToLeft();" />
                                        </Listeners>
                                        <ToolTips>
                                            <ext:ToolTip ID="ToolTip2" runat="server" Title="Remove" Html="<nobr>Remove Selected Items</nobr>" />
                                        </ToolTips>
                                    </ext:Button>
                                    <ext:Button ID="ButtonAllLeft" runat="server" Icon="ResultsetFirst" Width="30">
                                        <Listeners>
                                            <Click Handler="allFromRightToLeft();" />
                                        </Listeners>
                                        <ToolTips>
                                            <ext:ToolTip ID="ToolTip1" runat="server" Title="Remove all" Html="<nobr>Remove All Items</nobr>" />
                                        </ToolTips>
                                    </ext:Button>
                                </Items>
                            </ext:Panel>
                        </ext:Cell>
                        <ext:Cell>
                            <ext:Panel ID="Panel15" runat="server" Layout="FitLayout" Border="true" BodyStyle="height: 260px;"
                                Title="Selected Items">
                                <Items>
                                    <ext:GridPanel ID="GridPanelRight" runat="server" EnableDragDrop="true" DDGroup="GridPanelLeftDDGroup"
                                        Width="560" Height="250" StoreID="StoreRight" Frame="false" Border="true" StripeRows="true"
                                        TrackMouseOver="true" ActiveIndex="0" SelectionMemory="Enabled" Split="true"
                                        AutoScroll="true">
                                        <ColumnModel runat="server" ID="ColumnModel2">
                                            <Columns>
                                                <ext:Column ColumnID="IconColumn" MenuDisabled="true" Sortable="false" Resizable="false"
                                                    Hideable="false" Width="26">
                                                    <Renderer Fn="recordIconRenderer" />
                                                </ext:Column>
                                                <ext:Column ColumnID="AddressID" Header="AddressID" DataIndex="AddressID"
                                                    Hidden="true" />
                                                <ext:Column ColumnID="Address1" Header="Address Line1" DataIndex="Address1"
                                                    Width="140" />
                                                <ext:Column ColumnID="Address2" Header="Address Line2" DataIndex="Address2"
                                                    Width="130" />
                                                <ext:Column ColumnID="City" Header="City" DataIndex="City" Width="80" />
                                                <ext:Column ColumnID="ZIP" Header="Postal Code" DataIndex="ZIP" Width="80">
                                                </ext:Column>
                                                <ext:Column ColumnID="Province" Header="Province" DataIndex="Province"
                                                    Width="80" />
                                            </Columns>
                                        </ColumnModel>
                                        <SelectionModel>
                                            <ext:RowSelectionModel runat="server" SingleSelect="false" ID="RowSelectionModel2">
                                            </ext:RowSelectionModel>
                                        </SelectionModel>
                                        <LoadMask ShowMask="true" />
                                        <Listeners>
                                            <RowClick Handler="#{ButtonOneLeft}.enable();" />
                                            <RowDblClick Handler="fromRightToLeft();" />
                                        </Listeners>
                                    </ext:GridPanel>
                                </Items>
                            </ext:Panel>
                        </ext:Cell>
                    </Cells>
                </ext:TableLayout>
            </Items>
        </ext:Panel>
        <ext:DropTarget ID="DropTarget1" runat="server" Target="={GridPanelLeft.view.scroller.dom}"
            Group="GridPanelLeftDDGroup">
            <NotifyDrop Fn="notifyDropToLeft" />
        </ext:DropTarget>
        <ext:DropTarget ID="DropTarget2" runat="server" Target="={GridPanelRight.view.scroller.dom}"
            Group="GridPanelRightDDGroup">
            <NotifyDrop Fn="notifyDropToRight" />
        </ext:DropTarget>
        </form>
    </body>
    </html>
  7. #7
    Quote Originally Posted by Daniil View Post
    Hmm, an interesting issue with a scrollbar. We are investigating.

    Here is a simplified sample to reproduce.

    Steps are:

    1. Scroll at the bottom or about middle
    2. Select a row
    3. Click the removeAll Button => a scrollbar doesn't disappear

    Interesting the issue is not reproducible without #1 or #2 steps.

    Example
    <%@ Page Language="C#" %>
    
    <%@ Register Assembly="Ext.Net" Namespace="Ext.Net" TagPrefix="ext" %>
    
    <script runat="server">
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!X.IsAjaxRequest)
            {
                Store store = this.GridPanel1.GetStore();
                store.DataSource = new object[] 
                { 
                    new object[] { "test1" },
                    new object[] { "test2" },
                    new object[] { "test3" },
                    new object[] { "test4" },
                    new object[] { "test5" },
                    new object[] { "test6" },
                    new object[] { "test7" },
                    new object[] { "test8" },
                    new object[] { "test9" }
                };
                store.DataBind();
            }
        }
    </script>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>Ext.NET Example</title>
    
        <script type="text/javascript">
            var removeAll = function () {
                var store = GridPanel1.getStore();
                
                store.suspendEvents(false); 
                store.remove(store.getAllRange());
                store.resumeEvents();
    
                GridPanel1.getView().refresh();
    
            };
        </script>
    </head>
    <body>
        <form runat="server">
            <ext:ResourceManager runat="server" />
    
            <ext:GridPanel 
                ID="GridPanel1" 
                runat="server" 
                Height="100" 
                Width="200">
                <Store>
                    <ext:Store runat="server">
                        <Reader>
                            <ext:ArrayReader>
                                <Fields>
                                    <ext:RecordField Name="test" />
                                </Fields>
                            </ext:ArrayReader>
                        </Reader>
                    </ext:Store>
                </Store>
                <ColumnModel runat="server">
                    <Columns>
                        <ext:Column Header="Test" DataIndex="test" />
                    </Columns>
                </ColumnModel>
            </ext:GridPanel>
    
            <ext:Button runat="server" Text="remove all">
                <Listeners>
                    <Click Fn="removeAll" />
                </Listeners>
            </ext:Button>
        </form>
    </body>
    </html>
    I have no better workaround than determine manually if a scrollbar is not required and hide it:
    GridPanel1.getView().scroller.setStyle('overflow-y', 'hidden');
  8. #8
    Quote Originally Posted by Daniil View Post
    I have no better workaround than determine manually if a scrollbar is not required and hide it:
    GridPanel1.getView().scroller.setStyle('overflow-y', 'hidden');
    Hi Daniil,

    Could you be more specific as to advise what's the condition to test to apply this workaround? Obviously, it's got to be done when the Store is empty. But if it's not, hiding the vertical scroll bar cuts records out of view.
  9. #9
    Quote Originally Posted by vadym.f View Post
    Thanks Daniil,

    Please keep me in the loop. BTW, what's the most optimal way of selecting all the records in the Store? Is it

    store.getAllRange();
    or

    // No parameters
    store.getRange();
    I've noticed that getAllRange() isn't documented by Sencha at http://docs.sencha.com/ext-js/3-4/#!/api/Ext.data.Store. Is it just a random omission on their part or does it happen all the time, from your experience with them?
    This is not a part of ExtJS. This method appears in PagingStore. Here how it looks.
    getAllRange : function (start, end) {
        return (this.snapshot || this.allData || this.data).getRange(start, end);
    }
  10. #10
    Quote Originally Posted by vadym.f View Post
    Hi Daniil,

    Could you be more specific as to advise what's the condition to test to apply this workaround? Obviously, it's got to be done when the Store is empty. But if it's not, hiding the vertical scroll bar cuts records out of view.
    Well, a Store's getCount method.

    But, I think you can forget it, we were able to find a better workaround.
    var removeAll = function () {
        var store = GridPanel1.getStore(),
            view = GridPanel1.getView();
    
        view.syncFocusEl(0); // workaround
        store.suspendEvents(false); 
        store.remove(store.getAllRange());
        store.resumeEvents();
        view.refresh();
    };
    Hope this helps.
Page 1 of 2 12 LastLast

Similar Threads

  1. [CLOSED] Problem with drag and drop from gridpanel to gridpanel
    By PoloTheMonk in forum 1.x Legacy Premium Help
    Replies: 1
    Last Post: Dec 16, 2011, 11:42 AM
  2. Replies: 2
    Last Post: Apr 13, 2011, 7:30 AM
  3. Drag-drop Gridpanel
    By johny_bravo in forum 1.x Help
    Replies: 0
    Last Post: Mar 25, 2011, 5:37 PM
  4. Replies: 2
    Last Post: Jul 13, 2010, 4:30 PM
  5. GridPanel drag and drop
    By davidhoyt in forum 1.x Help
    Replies: 5
    Last Post: Oct 13, 2008, 3:40 PM

Tags for this Thread

Posting Permissions