Dynamic gridpanel tooltip when row mouse over

  1. #1

    Dynamic gridpanel tooltip when row mouse over

    Hi,

    I want to show a tooltip when mouse over the record in gridpanel. My scenario is:

    I want to show a tooltip when user mouse over on record on gridpanel cell, the tooltip content are dynamic load base on gridpanel cell mouse over and it load base on company field which are binded (I suppose this field is unique).

    Is there anyway to do this? my example code below is i try to call server side script with javascript
    '<%= CodeBehind("' + record.get('company') + '") %>'
    but it does not work as i expect.

    // return "Company: " + companyname;
    it will show the company name in the tooltip, however i want to pass it throw server side script with
    return GetCompanyDescription(companyname).toString();
    it not work.

    aspx.cs
    protected void Page_Load(object sender, EventArgs e)
        {
            if (!X.IsAjaxRequest)
            {
                this.Store1.DataSource = new object[]
                {
                    new object[] { "3m Co", 71.72, 0.02, 0.03, "9/1 12:00am" },
                    new object[] { "Alcoa Inc", 29.01, 0.42, 1.47, "9/1 12:00am" },
                    new object[] { "Altria Group Inc", 83.81, 0.28, 0.34, "9/1 12:00am" },
                    new object[] { "American Express Company", 52.55, 0.01, 0.02, "9/1 12:00am" },
                    new object[] { "American International Group, Inc.", 64.13, 0.31, 0.49, "9/1 12:00am" },
                    new object[] { "AT&T Inc.", 31.61, -0.48, -1.54, "9/1 12:00am" },
                    new object[] { "Boeing Co.", 75.43, 0.53, 0.71, "9/1 12:00am" },
                    new object[] { "Caterpillar Inc.", 67.27, 0.92, 1.39, "9/1 12:00am" },
                    new object[] { "Citigroup, Inc.", 49.37, 0.02, 0.04, "9/1 12:00am" },
                    new object[] { "E.I. du Pont de Nemours and Company", 40.48, 0.51, 1.28, "9/1 12:00am" },
                    new object[] { "Exxon Mobil Corp", 68.1, -0.43, -0.64, "9/1 12:00am" },
                    new object[] { "General Electric Company", 34.14, -0.08, -0.23, "9/1 12:00am" },
                    new object[] { "General Motors Corporation", 30.27, 1.09, 3.74, "9/1 12:00am" },
                    new object[] { "Hewlett-Packard Co.", 36.53, -0.03, -0.08, "9/1 12:00am" },
                    new object[] { "Honeywell Intl Inc", 38.77, 0.05, 0.13, "9/1 12:00am" },
                    new object[] { "Intel Corporation", 19.88, 0.31, 1.58, "9/1 12:00am" },
                    new object[] { "International Business Machines", 81.41, 0.44, 0.54, "9/1 12:00am" },
                    new object[] { "Johnson & Johnson", 64.72, 0.06, 0.09, "9/1 12:00am" },
                    new object[] { "JP Morgan & Chase & Co", 45.73, 0.07, 0.15, "9/1 12:00am" },
                    new object[] { "McDonald\"s Corporation", 36.76, 0.86, 2.40, "9/1 12:00am" },
                    new object[] { "Merck & Co., Inc.", 40.96, 0.41, 1.01, "9/1 12:00am" },
                    new object[] { "Microsoft Corporation", 25.84, 0.14, 0.54, "9/1 12:00am" },
                    new object[] { "Pfizer Inc", 27.96, 0.4, 1.45, "9/1 12:00am" },
                    new object[] { "The Coca-Cola Company", 45.07, 0.26, 0.58, "9/1 12:00am" },
                    new object[] { "The Home Depot, Inc.", 34.64, 0.35, 1.02, "9/1 12:00am" },
                    new object[] { "The Procter & Gamble Company", 61.91, 0.01, 0.02, "9/1 12:00am" },
                    new object[] { "United Technologies Corporation", 63.26, 0.55, 0.88, "9/1 12:00am" },
                    new object[] { "Verizon Communications", 35.57, 0.39, 1.11, "9/1 12:00am" },
                    new object[] { "Wal-Mart Stores, Inc.", 45.45, 0.73, 1.63, "9/1 12:00am" }
                };
    
                this.Store1.DataBind();
            }
        }
        public string CodeBehind(string companyname)
        {
            // return "Company: " + companyname;
            return GetCompanyDescription(companyname).toString();
        }
    aspx

    <!DOCTYPE html>
    
    <html>
    <head runat="server">
        <title>GridPanel Cell with ToolTip - Ext.NET Examples</title>
        <link href="/resources/css/examples.css" rel="stylesheet" />    
    
        <script>
            var template = '<span style="color:{0};">{1}</span>';
    
            var change = function (value) {
                return Ext.String.format(template, (value > 0) ? "green" : "red", value);
            };
    
            var pctChange = function (value) {
                return Ext.String.format(template, (value > 0) ? "green" : "red", value + "%");
            };
            
            var onShow = function (toolTip, grid) {
                var view = grid.getView(),
                    store = grid.getStore(),
                    record = view.getRecord(view.findItemByChild(toolTip.triggerElement)),
                    column = view.getHeaderByCell(toolTip.triggerElement),
                    data = '<%= CodeBehind("' + record.get('company') + '") %>';
                    
                toolTip.update(data);
            };
        </script>
    </head>
    <body>
        <form runat="server">
            <ext:ResourceManager runat="server" />
            
            <ext:GridPanel 
                ID="GridPanel1" 
                runat="server"
                Title="Array Grid" 
                Width="600" 
                Height="350">
                <Store>
                    <ext:Store ID="Store1" runat="server">
                        <Model>
                            <ext:Model runat="server">
                                <Fields>
                                    <ext:ModelField Name="company" />
                                    <ext:ModelField Name="price" Type="Float" />
                                    <ext:ModelField Name="change" Type="Float" />
                                    <ext:ModelField Name="pctChange" Type="Float" />
                                    <ext:ModelField Name="lastChange" Type="Date" DateFormat="M/d hh:mmtt" />
                                </Fields>
                            </ext:Model>
                        </Model>
                    </ext:Store>
                </Store>
                <ColumnModel runat="server">
                    <Columns>
                        <ext:Column runat="server" Text="Company" DataIndex="company" Flex="1" />
                        <ext:Column runat="server" Text="Price" DataIndex="price">
                            <Renderer Format="UsMoney" />
                        </ext:Column>
                        <ext:Column runat="server" Text="Change" DataIndex="change">
                            <Renderer Fn="change" />
                        </ext:Column>
                        <ext:Column runat="server" Text="Change" DataIndex="pctChange">
                            <Renderer Fn="pctChange" />
                        </ext:Column>
                        <ext:DateColumn runat="server" Text="Last Updated" DataIndex="lastChange" />
                    </Columns>
                </ColumnModel>
                <SelectionModel>
                    <ext:RowSelectionModel runat="server" Mode="Single" />
                </SelectionModel>
                <View>
                    <ext:GridView runat="server" StripeRows="true" TrackOver="true" />
                </View>
            </ext:GridPanel>     
            
            <ext:ToolTip 
                runat="server" 
                Target="={#{GridPanel1}.getView().el}"
                Delegate=".x-grid-cell"
                TrackMouse="true">
                <Listeners>
                    <Show Handler="onShow(this, #{GridPanel1});" /> 
                </Listeners>
            </ext:ToolTip>     
        </form>
    </body>
    </html>
  2. #2
    Hello,

    Give CodeBehind method the [DirectMethod] attribute, and then call it from onShow() as App.direct.OnShow(record.get('company'));.

    See more about direct methods (and receiving values returned by them) here: DirectMethod Overview

    Hope this helps!

    Just as a side note, a server roundtrip for just updating tooltips will most likely give a bad negative impact to the user experience. As the user hover the mouse on the cell, a postback round-trip will happen, and this will delay arbitrarily the time to the actual data of the tooltip to be retrieved.

    If possible, you can load the data to a hidden column to the grid (if it can't be composed from grid's current data on the row hovered) and then load the tooltip from this data.
    Fabrício Murta
    Developer & Support Expert
  3. #3
    Hi AMfabricio.murta,

    Thank for your help, let me try with this hope it can be help. By the way, i can load the that field into the grid and show as a tooltip but it kinda damn slow when i try to refresh grid or searching record with the grid - it about 10 times slower (normally it about 4 to 5 second to refresh but when i put this filed into the store it spend about 40 or 45 sec to refresh). I don't know why it slow when my grid store bind with description field nvarchar(max).

    Thank again.
    Chhay
  4. #4
    Hello @cchhay!

    Well, it will be too much guessing to state what is it making your grid slow just by adding a column.

    Do you think you can write a test case with dummy data (maybe, generated in a for loop) so I can reproduce this slow behavior on my side?

    If my first guess is right, it will not be possible to reproduce the issue within a for loop. The guess is this: you might be accessing a database to fetch the results and, in order to build the data for the additional column, you are making a lot of SQL queries -- thus this makes it slow. Adding to the guess, the search might rely on querying the server again (and applying the filter in the slow set of SQL queries).

    Well, but that's just a guess. Which will be proven wrong if you can come up with the test case to reproduce the slow performance.

    Maybe it is a good idea to treat the slow performance in a new thread so, if you can come up with an example reproducing it, would you mind posting it in a new thread?
    Fabrício Murta
    Developer & Support Expert

Similar Threads

  1. Replies: 9
    Last Post: Sep 21, 2015, 9:39 AM
  2. [CLOSED] GridPanel - CommandColumn - dynamic Tooltip
    By jamesand in forum 2.x Legacy Premium Help
    Replies: 6
    Last Post: Aug 22, 2013, 4:33 PM
  3. Replies: 1
    Last Post: Apr 25, 2013, 6:02 AM
  4. mouse over tooltip on radio button boxLabel
    By tjoklee in forum 1.x Help
    Replies: 0
    Last Post: Sep 21, 2010, 6:19 AM
  5. Replies: 2
    Last Post: Aug 05, 2010, 6:39 PM

Tags for this Thread

Posting Permissions