解决方案 »
- VB翻译成C#问题
- 如何使用C#的反射机制读取静态类的字段名称及值
- 设置2个OpenFileDialog,想让他们分别打开上次打开的地址
- System.Timers.Timer 为什么不响应了
- winform嵌入FLASH的问题
- 使用SqlDataAdapter填充数据遇到的问题(另寻找杭州的.net程序员)
- 请问什么是SaveAsFile.dll控件?哪有介绍的文章和这SaveAsFile.dll控件下载啊?能不能给个网址?到处找了,没找到什么东西啊!谢谢!
- 谁能告诉我要成为一名职业c#程序员要达到什么水平啊,我是一名马上要毕业的大专生
- 学习C#需要什么样的基础?我适合学C#吗?(呵,清家荡产只有这点分了)
- 莫名其妙的错误“Automation服务器不能创建对象”
- 操作sqlserver,从一个数据库导入数据到另一个数据库中,性能好低
- 动态生成某个类的实例,并调用该类的方法
既然已经做好了form,为什么要把里面控件都扣出来重新放到panel里,这有什么意义吗给你2个思路
1.不要用form,用用户控件,然后把用户控件直接add进panel里
2.把form作为MDI子窗体嵌入panel里
private static List<Form> frmList = new List<Form>(); /// <summary>
/// 在容器中显示窗体
/// </summary>
/// <param name="parent">父容器</param>
/// <param name="form">窗体名称</param>
/// <param name="pos">窗体初始位置</param>
/// <param name="state">窗体显示模式</param>
/// <returns></returns>
public static bool CreateFormClass(Panel parent, Form form, FormStartPosition pos, FormWindowState state)
{
try
{
if (parent != null)
{
if (frmList != null)
{
while (frmList.Count > 0)
{
frmList[0].Close();
frmList[0].Dispose();
frmList.Remove(frmList[0]);
}
}
if (parent.HasChildren)
{
parent.Controls.Clear();
}
form.TopLevel = false;
form.Parent = parent;
form.WindowState = state;
form.StartPosition = pos;
form.Show();
frmList.Add(form);
return true;
}
else
{
form.Parent = null;
form.TopLevel = true;
switch (state)
{
case FormWindowState.Maximized:
{
form.MaximumSize = new Size(Screen.PrimaryScreen.WorkingArea.Width, Screen.PrimaryScreen.WorkingArea.Height);
form.WindowState = FormWindowState.Maximized;
break;
}
default:
{
form.WindowState = state;
break;
}
}
form.StartPosition = pos;
form.ShowDialog();
return true;
}
}
catch (Exception ex)
{
return false;
}
}我这里每次new 新form 时, 都将之前的释放了.可以将窗体显示在容器中, 也可以以指定方式的显示..
楼主可以修改下试试.
我也想这样
可是不知道如何实现,谢谢
我也想这样
可是不知道如何实现,谢谢
首先,要嵌入的窗体必须设置MDIContainer为true
然后,new form的时候
Form2 fm=new Form2();
fm.MDIParent=this;
panel1.Controls.Add(fm);
fm.Show();
我是做ArcGIS engine+C#开发的
开始都是用command或itool做的
但是Command、Itool中的form不能在主窗口中停靠
所以在主窗口中动态panel,然后把form的控件加载到panel中
可以实现在主窗口的停靠。
您说的对,直接改为用户控件,可以实现;这样在主窗口会多很多代码。
我还有很多工具条,如果都放在主窗口
代码太多。
代码只会减少,怎么可能会多.其实就跟你放到form里是一样的,既然控件放到form里,代码也写到form里
改成用户控件,你也把代码写在用户控件里啊
这样起码你主窗体不需要设置为MDI容器,也不需要设置子窗体的parent
主窗口的panel可以停靠
如果直接在主窗口中加,代码会增加很多
panel.Size = new System.Drawing.Size(m_FormEditFeature.Width + 10, m_FormEditFeature.Height);
panel.Name = m_FormEditFeature.Name;
panel.Text = m_FormEditFeature.Text; panel.DockStyle = PanelDockStyle.Right;
panel.DockState = PanelDockState.Docked; //对象初始化
((System.ComponentModel.ISupportInitialize)(panel)).BeginInit();
panel.Id = Guid.NewGuid();
//临时挂起控件的布局逻辑
panel.SuspendLayout();
m_UIPanelManager.Panels.Add(panel);
UIPanelInnerContainer panelContainer = new UIPanelInnerContainer();
panel.InnerContainer = panelContainer; try
{
//插件必须保证ChildHWND正确,否则会发生异常
int r = m_FormEditFeature.Controls.Count;
for (int i = r - 1; i >= 0; i--)
{
panelContainer.Controls.Add(m_FormEditFeature.Controls[i]); //(frm.Handle)
}
panelContainer.Dock = DockStyle.Fill; panelContainer.Location = new System.Drawing.Point(5, 30);
panelContainer.Name = m_FormEditFeature.Name + "Container";
panelContainer.Size = new System.Drawing.Size(panel.Width - 10, panel.Height - 30);
panelContainer.TabIndex = 0;
}
catch (Exception ex)
{ MessageBox.Show(ex.Message, "异常提示!"); } ((System.ComponentModel.ISupportInitialize)(panel)).EndInit(); m_FormEditFeature.FormIdentify_Load();
如果有多个panel,可以SplitContainer里再嵌套SplitContainer,或者根据窗体高度动态修改每个panel的大小
位置不用管,只要把属性都设置成top,它自己就会跟着走了或者上面的设置成top,最下面的设置成fill