如何以windws形式向tablelayoutpanel添加新行 [英] How to add a new row to tablelayoutpanel in windws form

查看:49
本文介绍了如何以windws形式向tablelayoutpanel添加新行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


我创建了一个带有tablelayout面板的win表单应用程序。


点击按钮我想重复一遍上面的行与控件和数据源相同,但选择清楚。


怎么做?

解决方案

< blockquote>

你好NirajZ,


如果你想重复控制,你必须先克隆它,众所周知,控件都是类,所以你也有要深入复制它们,请参考以下克隆类:

 public class ControlFactory 
{
public ControlFactory()
{
//
// TODO:在这里添加构造函数逻辑
//
}

public static控件CreateControl(string ctrlName,string partialName)
{
尝试
{
控制ctrl;
开关(ctrlName)
{
case" Label":
ctrl = new Label();
休息;
case" TextBox" ;:
ctrl = new TextBox();
休息;
case" PictureBox":
ctrl = new PictureBox();
休息;
case" ListView":
ctrl = new ListView();
休息;
case" ComboBox" ;:
ctrl = new ComboBox();
休息;
case" Button":
ctrl = new Button();
休息;
case" CheckBox":
ctrl = new CheckBox();
休息;
case" MonthCalender" ;:
ctrl = new MonthCalendar();
休息;
case" DateTimePicker" ;:
ctrl = new DateTimePicker();
休息;
默认值:
程序集controlAsm = Assembly.LoadWithPartialName(partialName);
类型controlType = controlAsm.GetType(partialName +"。" + ctrlName);
ctrl =(Control)Activator.CreateInstance(controlType);
休息;

}
返回ctrl;

}
catch(exception ex)
{
System.Diagnostics.Trace.WriteLine(" create control failed:" + ex.Message);
返回新的Control();
}
}

public static void SetControlProperties(Control ctrl,Hashtable propertyList)
{
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(ctrl);

foreach(属性中的PropertyDescriptor myProperty)
{
if(propertyList.Contains(myProperty.Name))
{
Object obj = propertyList [myProperty 。名称];
尝试
{
myProperty.SetValue(ctrl,obj);
}
catch(Exception ex)
{
//什么都不做,只需继续
System.Diagnostics.Trace.WriteLine(ex.Message);
}
}
}
}

公共静态控制CloneCtrl(控制ctrl)
{
CBFormCtrl cbCtrl = new CBFormCtrl (CTRL);
控制newCtrl = ControlFactory.CreateControl(cbCtrl.CtrlName,cbCtrl.PartialName);
ControlFactory.SetControlProperties(newCtrl,cbCtrl.PropertyList);
返回newCtrl;
}

public static void CopyCtrl2ClipBoard(Control ctrl)
{
CBFormCtrl cbCtrl = new CBFormCtrl(ctrl);
IDataObject ido = new DataObject();

ido.SetData(CBFormCtrl.Format.Name,true,cbCtrl);
Clipboard.SetDataObject(ido,false);
}

public static Control GetCtrlFromClipBoard()
{
Control ctrl = new Control();

IDataObject ido = Clipboard.GetDataObject();
if(ido.GetDataPresent(CBFormCtrl.Format.Name))
{
CBFormCtrl cbCtrl = ido.GetData(CBFormCtrl.Format.Name)as CBFormCtrl;

ctrl = ControlFactory.CreateControl(cbCtrl.CtrlName,cbCtrl.PartialName);
ControlFactory.SetControlProperties(ctrl,cbCtrl.PropertyList);
}
返回ctrl;
}
}

#region剪贴板支持
///< summary>
/// CBFormCtrl的摘要说明。
///< / summary>
[Serializable()]
公共类CBFormCtrl //剪贴板表单控件
{
私有静态DataFormats.Format格式;
private string ctrlName;
private string partialName;
private Hashtable propertyList = new Hashtable();

静态CBFormCtrl()
{
//使用windows剪贴板注册新的数据格式
format = DataFormats.GetFormat(typeof(CBFormCtrl).FullName);
}

public static DataFormats.Format格式
{
get
{
返回格式;
}
}
公共字符串CtrlName
{
get
{
return ctrlName;
}
设置
{
ctrlName = value;
}
}

公共字符串PartialName
{
get
{
return partialName;
}
设置
{
partialName = value;
}
}

public Hashtable PropertyList
{
get
{
return propertyList;
}
}

公共CBFormCtrl()
{

}

公共CBFormCtrl(控制ctrl)
{
CtrlName = ctrl.GetType()。Name;
PartialName = ctrl.GetType()。Namespace;

PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(ctrl);

foreach(PropertyDescriptor myProperty in properties)
{
try
{
if(myProperty.PropertyType.IsSerializable)
propertyList.Add( myProperty.Name,myProperty.GetValue(ctrl));
}
catch(exception ex)
{
System.Diagnostics.Trace.WriteLine(ex.Message);
//什么都不做,只需继续
}
}
}
}
#endregion

您还可以参考以下链接:


如何克隆/序列化/复制&粘贴Windows窗体控件


然后在按钮中单击:

 private void button9_Click(object sender,EventArgs e)
{
tableLayoutPanel1.RowCount ++;
for(int column = 0; column< tableLayoutPanel1.ColumnStyles.Count; column ++)
{
Control c = this.tableLayoutPanel1.GetControlFromPosition(column,tableLayoutPanel1.RowCount-2);
控制ctrl = ControlFactory.CloneCtrl(c);

for(int row = 0; row< tableLayoutPanel1.RowStyles.Count; row ++)
{
tableLayoutPanel1.Controls.Add(ctrl,column,tableLayoutPanel1.RowCount-1 );
}
}
}




希望这会有所帮助!


最好的问候,


Stanly


Hi,

I have created a win form application with tablelayout panel.

On click of button i would like to repeat the same above row along with controls and data source but with clear selection.

How to do it?

解决方案

Hi NirajZ,

If you want to repeat the control, you have to clone it first, and as we all know, the controls are all classes so you also have to copy them in depth, please refer to the following clone class:

    public class ControlFactory
    {
        public ControlFactory()
        {
            //
            // TODO: Add constructor logic here
            //
        }

        public static Control CreateControl(string ctrlName, string partialName)
        {
            try
            {
                Control ctrl;
                switch (ctrlName)
                {
                    case "Label":
                        ctrl = new Label();
                        break;
                    case "TextBox":
                        ctrl = new TextBox();
                        break;
                    case "PictureBox":
                        ctrl = new PictureBox();
                        break;
                    case "ListView":
                        ctrl = new ListView();
                        break;
                    case "ComboBox":
                        ctrl = new ComboBox();
                        break;
                    case "Button":
                        ctrl = new Button();
                        break;
                    case "CheckBox":
                        ctrl = new CheckBox();
                        break;
                    case "MonthCalender":
                        ctrl = new MonthCalendar();
                        break;
                    case "DateTimePicker":
                        ctrl = new DateTimePicker();
                        break;
                    default:
                        Assembly controlAsm = Assembly.LoadWithPartialName(partialName);
                        Type controlType = controlAsm.GetType(partialName + "." + ctrlName);
                        ctrl = (Control)Activator.CreateInstance(controlType);
                        break;

                }
                return ctrl;

            }
            catch (Exception ex)
            {
                System.Diagnostics.Trace.WriteLine("create control failed:" + ex.Message);
                return new Control();
            }
        }

        public static void SetControlProperties(Control ctrl, Hashtable propertyList)
        {
            PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(ctrl);

            foreach (PropertyDescriptor myProperty in properties)
            {
                if (propertyList.Contains(myProperty.Name))
                {
                    Object obj = propertyList[myProperty.Name];
                    try
                    {
                        myProperty.SetValue(ctrl, obj);
                    }
                    catch (Exception ex)
                    {
                        //do nothing, just continue
                        System.Diagnostics.Trace.WriteLine(ex.Message);
                    }
                }
            }
        }

        public static Control CloneCtrl(Control ctrl)
        {
            CBFormCtrl cbCtrl = new CBFormCtrl(ctrl);
            Control newCtrl = ControlFactory.CreateControl(cbCtrl.CtrlName, cbCtrl.PartialName);
            ControlFactory.SetControlProperties(newCtrl, cbCtrl.PropertyList);
            return newCtrl;
        }

        public static void CopyCtrl2ClipBoard(Control ctrl)
        {
            CBFormCtrl cbCtrl = new CBFormCtrl(ctrl);
            IDataObject ido = new DataObject();

            ido.SetData(CBFormCtrl.Format.Name, true, cbCtrl);
            Clipboard.SetDataObject(ido, false);
        }

        public static Control GetCtrlFromClipBoard()
        {
            Control ctrl = new Control();

            IDataObject ido = Clipboard.GetDataObject();
            if (ido.GetDataPresent(CBFormCtrl.Format.Name))
            {
                CBFormCtrl cbCtrl = ido.GetData(CBFormCtrl.Format.Name) as CBFormCtrl;

                ctrl = ControlFactory.CreateControl(cbCtrl.CtrlName, cbCtrl.PartialName);
                ControlFactory.SetControlProperties(ctrl, cbCtrl.PropertyList);
            }
            return ctrl;
        }
    }

    #region Clipboard Support
    /// <summary>
    /// Summary description for CBFormCtrl.
    /// </summary>
    [Serializable()]
    public class CBFormCtrl//clipboard form control
    {
        private static DataFormats.Format format;
        private string ctrlName;
        private string partialName;
        private Hashtable propertyList = new Hashtable();

        static CBFormCtrl()
        {
            // Registers a new data format with the windows Clipboard
            format = DataFormats.GetFormat(typeof(CBFormCtrl).FullName);
        }

        public static DataFormats.Format Format
        {
            get
            {
                return format;
            }
        }
        public string CtrlName
        {
            get
            {
                return ctrlName;
            }
            set
            {
                ctrlName = value;
            }
        }

        public string PartialName
        {
            get
            {
                return partialName;
            }
            set
            {
                partialName = value;
            }
        }

        public Hashtable PropertyList
        {
            get
            {
                return propertyList;
            }
        }

        public CBFormCtrl()
        {

        }

        public CBFormCtrl(Control ctrl)
        {
            CtrlName = ctrl.GetType().Name;
            PartialName = ctrl.GetType().Namespace;

            PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(ctrl);

            foreach (PropertyDescriptor myProperty in properties)
            {
                try
                {
                    if (myProperty.PropertyType.IsSerializable)
                        propertyList.Add(myProperty.Name, myProperty.GetValue(ctrl));
                }
                catch (Exception ex)
                {
                    System.Diagnostics.Trace.WriteLine(ex.Message);
                    //do nothing, just continue
                }
            }
        }
    }
    #endregion

You can also refer to the following link about this:

How to Clone/Serialize/Copy & Paste a Windows Forms Control

Then in the button click:

        private void button9_Click(object sender, EventArgs e)
        {
            tableLayoutPanel1.RowCount++;
            for (int column = 0; column < tableLayoutPanel1.ColumnStyles.Count; column++)
            {
                Control c = this.tableLayoutPanel1.GetControlFromPosition(column, tableLayoutPanel1.RowCount-2);
                Control ctrl = ControlFactory.CloneCtrl(c);

                for (int row = 0; row < tableLayoutPanel1.RowStyles.Count; row++)
                {
                    tableLayoutPanel1.Controls.Add(ctrl, column, tableLayoutPanel1.RowCount-1);
                }                
            }
        }


Hope this helps!

Best Regards,

Stanly


这篇关于如何以windws形式向tablelayoutpanel添加新行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆