views:

291

answers:

2

I'm utilizing the code posted by Jesper Palm here: http://stackoverflow.com/questions/280891/make-user-control-display-outside-of-form-boundry

/// <summary>
/// A simple popup window that can host any System.Windows.Forms.Control
/// </summary>
public class PopupWindow : System.Windows.Forms.ToolStripDropDown
{
    private System.Windows.Forms.Control _content;
    private System.Windows.Forms.ToolStripControlHost _host;

    public PopupWindow(System.Windows.Forms.Control content)
    {
        //Basic setup...
        this.AutoSize = false;
        this.DoubleBuffered = true;
        this.ResizeRedraw = true;

        this._content = content;
        this._host = new System.Windows.Forms.ToolStripControlHost(content);

        //Positioning and Sizing
        this.MinimumSize = content.MinimumSize;
        this.MaximumSize = content.Size;
        this.Size = content.Size;
        content.Location = Point.Empty;

        //Add the host to the list
        this.Items.Add(this._host);
    }
}

I've translated it to VB:

Public Class PopupWindow
    Inherits System.Windows.Forms.ToolStripDropDown

    Private _content As System.Windows.Forms.Control
    Private _host As System.Windows.Forms.ToolStripControlHost

    Public Sub New(ByVal content As System.Windows.Forms.Control)

        Me.AutoSize = False
        Me.DoubleBuffered = True
        Me.ResizeRedraw = True

        Me._content = content
        Me._host = New System.Windows.Forms.ToolStripControlHost(content)

        Me.MinimumSize = content.MinimumSize
        Me.MaximumSize = content.MaximumSize
        Me.Size = content.Size
        content.Location = Point.Empty

        Me.Items.Add(Me._host)

    End Sub

End Class

It works great with a PictureBox showing its information. But for some reason I cannot get the DataGridView to display anything when it is in the popup.

If I pull the grid out of the popup it displays all of its information fine. If I pause during debug, the grid shows that it has all the data in it. It's just not displaying anything.

Does anybody have any ideas?

A: 

It's probably a drawing issue. Maybe you could try a .Refresh on either the popupcontainer or the grid after it's been shown?

Fake
I've tried using the .Refresh on the control itself, as well as the datagridview. None of that has worked.
jblaske
+1  A: 

I have not been able to reproduce your problem. Can you provide more code? I've been testing in VS2010 RC (.NET 4) and VS2008 (.NET 3.5) and this code works in both:

public partial class Form1 : Form
{
    public class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string PhoneNumber { get; set; }
    }

    List<Person> _People;

    public Form1()
    {
        InitializeComponent();

        _People = new List<Person>();
        _People.Add(new Person() { FirstName = "John", LastName = "Smith", PhoneNumber = "123-456-7890" });
        _People.Add(new Person() { FirstName = "Jane", LastName = "Doe", PhoneNumber = "098-765-4321" });
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        pictureBox1.Image = Image.FromFile("barcode.png");
        pictureBox1.Location = new Point(-1000, -1000);

        dataGridView1.DataSource = _People;
        dataGridView1.Location = new Point(-1000, -1000);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        PopupControl popup = new PopupControl(pictureBox1);
        popup.Show(new Point(this.Location.X - 128, this.Location.Y));
    }

    private void button2_Click(object sender, EventArgs e)
    {
        PopupControl popup = new PopupControl(dataGridView1);
        popup.Show(new Point(this.Location.X - 128, this.Location.Y));

        //optionally change the items in the data source
        _People.Add(new Person() { FirstName = "NewFirst", LastName = "NewLast", PhoneNumber = "123-333-3322" });

        //reset the bindings
        bindingSource1.DataSource = _People;
        bindingSource1.ResetBindings(true);
    }
}

Here's what it looks like: alt text

In the designer, you should setup the BindingSource and assign it as the DataGridView's DataSource.

Jason Williams
I gave your code a shot, it works great the way you have it. But i made a few modifications so that its working more like my situation, and that's when i started experiencing the same problem again.instead of creating a new popup object every time, create one global object that is just re-shown each click.if you then set the datasource to the grid before adding it to the popup control, when it shows the grid will display data.however, if you add the datagrid to the popup control, any assignments to the datasource are ignored, visually at least.
jblaske
I just updated my original comment. It helps if you use a BindingSource instead of directly assigning the DataGridView.DataSource property.
Jason Williams
after a little big of tweaking with the bindingsource I was able to get it to work. Thank you very much!
jblaske