如何在Winforms中回放DataGridView

时间:2014-07-14 08:39:13

标签: c# winforms datagridview

所以,我有一个项目,我允许在单独的表单中编辑DatagridView。我将DatagridView对象及其父容器传递给新Form的构造函数。

这很好用,我可以用这种方式编辑网格。但是当我尝试通过将其父级更改回原始格式来将其还原时,我收到此错误:

Cannot convert type 'System.Windows.Forms.MenuItem' to 'System.Windows.Forms.Control'   

现在,MenuItem和Manual Entry都直接从Form继承。

这是我的代码从原始表单(正常工作)中获取DataGridView

public partial class ManualEntry : Form
{
    private Data d;
    DataGridView DataView;
    MenuItem mi;

    public ManualEntry(DataGridView ExcelDisplay, Data d, MenuItem menuItem)
    {
        InitializeComponent();

        //Take the Datagridview from the MenuItem.

        DataView = ExcelDisplay;
        DataView.Parent = this;
        mi = menuItem;
        this.d = d;
        this.DataView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
        this.DataView.Location = new System.Drawing.Point(15, 76);
        this.DataView.Size = new System.Drawing.Size(237, 211);
        this.DataView.TabIndex = 5;
        this.DataView.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.DataView_CellContentClick);
    }

现在我要试着把它还给我。当然它会产生上述错误。

    private void FinishButton_Click(object sender, EventArgs e)
    {
        //move the datagridview back to the original form and give its old size,shape, and position back.

        DataView.Parent = mi;
        this.DataView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
        this.DataView.Location = new System.Drawing.Point(12, 167);
        this.DataView.Name = "ExcelDisplay";
        this.DataView.Size = new System.Drawing.Size(250, 256);
        this.DataView.TabIndex = 7;
        this.Close();
    }

我也尝试过无法使用的投射。

 DataView.Parent = (System.Windows.Forms.Control)mi;

更新 这表明MenuItem也是一个表单。

public partial class MenuItem : Form
{

1 个答案:

答案 0 :(得分:1)

  

这表明MenuItem也是一个表单。

嗯,你没有说服编译器。您可以从错误消息中判断出它认为您的“mi”变量是System.Windows.Forms.MenuItem。 为您自己的类型使用.NET类名称,这会让您的生活更难以解决这样的错误。不要使用像“d”这样的变量名。选择好名字是一个非常重要的程序员的工作。

正确的方法是保留控件的Parent属性,以便您可以将其设置回来。大致是:

public partial class ManualEntry : Form
{
    private Data DataViewData;
    private DataGridView DataView;
    private Point DataViewLocation;
    private Control DataViewParent;

    public ManualEntry(DataGridView ExcelDisplay, Data data)
    {
        InitializeComponent();
        this.DataViewData = data;
        this.DataView = ExcelDisplay;
        this.DataViewLocation = ExcelDisplay.Location;
        this.DataViewParent = ExcelDisplay.Parent;
        this.DataView.Parent = this;
        // etc...
    }

    protected override void OnFormClosing(FormClosingEventArgs e) {
        base.OnFormClosing(e);
        if (!e.Cancel) {
            DataView.Parent = this.DataViewParent;
            DataView.Location = this.DataViewLocation;
            // etc..
        }
    }
}