所以,我有一个项目,我允许在单独的表单中编辑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
{
答案 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..
}
}
}