Home
Options

Is it possible to use Util.Demand when dumping to another panel?

I'm trying to use Util.Demand when dumping an object to a new Panel using the extension method from https://forum.linqpad.net/discussion/1088/dumping-in-different-panel ?

I am currently having two issues.
1. When you click on the Link you get a javascript error Unable to get property 'webview' or undefined or null reference.
2. if you dump an object which implements LINQPad.ICustomMemberProvider , then the link is not even displayed.

The following is a very simple example script

void Main()
{
    var dates = (from r in Enumerable.Range(1, 5) select new DateTime(2003, 8, r)).ToArray();
    (from r in dates select new DailyValue1 { Date = r, Link = Util.OnDemand("Evaluate", () => r) }).DumpX("Panel");
    (from r in dates select new DailyValue2 { Date = r, Link = Util.OnDemand("Evaluate", () => r) }).DumpX("Panel");
}

public class DailyValue1  
{
    public DateTime Date { get; set; }
    public object? Link { get; set; }
}

public class DailyValue2 : LINQPad.ICustomMemberProvider
{
    public DateTime Date { get; set; }

    public DumpContainer? Link{ get; set; }

    IEnumerable<string> ICustomMemberProvider.GetNames()
    {
        return new[] { "Date", "Link" };
    }

    IEnumerable<Type> ICustomMemberProvider.GetTypes()
    {
        return new[] { typeof(DateTime), typeof(DumpContainer) };
    }

    IEnumerable<object?> ICustomMemberProvider.GetValues()
    {
        return new object?[] { this.Date, this?.Link, };
    }
}

public static class Extensions
{
    public static T DumpX<T>(this T toDump, string panelName)
    {
        System.Windows.Forms.WebBrowser browser;
        TextWriter formatter;

        var panel = PanelManager.GetOutputPanel(panelName);
        bool first = panel == null;
        if (first)
        {
            panel = PanelManager.DisplayControl(browser = new System.Windows.Forms.WebBrowser(), panelName);
            formatter = Util.CreateXhtmlWriter(true);
            browser.Tag = formatter;
            bool init = true;
            browser.DocumentCompleted += (sender, args) =>
            {
                if (init) browser.DocumentText = formatter.ToString();
                init = false;
            };
        }
        else
        {
            browser = (System.Windows.Forms.WebBrowser)(panel.GetControl());
            formatter = (TextWriter)browser.Tag;
        }

        formatter.WriteLine(toDump);

        if (first || browser.ReadyState == System.Windows.Forms.WebBrowserReadyState.Complete)
            browser.DocumentText = formatter.ToString();

        return toDump;
    }
}

Is there any way around this?

Sign In or Register to comment.