很多系统都带有自定义报表的功能,而此功能都需依参数自动生成控件,举例如下:

  

  如上图,一条查询语句当中,包含了3个参数,其中两个是日期型(使用:DATE!进行标识),一个是字符型(使用:进行标识),要生成的效果图如下所示:

  

  代码如下:

private void FrmDefine_MyEventClose(string strID, string strName, string strSql)
{
//值传递
ReturnID = strID;
ReturnName = strName;
ReturnSql = strSql;
//空格清除
while (ReturnSql.IndexOf(": ") != -)
{
ReturnSql = ReturnSql.Replace(": ", ":");
}
while (ReturnSql.IndexOf(":DATE! ") != -)
{
ReturnSql = ReturnSql.Replace(":DATE! ", ":DATE!");
}
//产生标题
rtxtName.Text = "[" + strID + "]" + strName;
rtxtName.SelectionAlignment = System.Windows.Forms.HorizontalAlignment.Center;
//清除控件
splitContainer2.Panel1.Controls.Clear();
//添加控件
if (strSql.IndexOf(":") != -)
{
int ParamIndex = ; //参数序号,从100往前倒数。
ParamSql = string.Empty;
List<string> list = new List<string>(ReturnSql.Split(' '));
for (int i = list.Count - ; i > -; i--)
{
if (list[i].IndexOf(":") == -)
{
ParamSql = list[i] + " " + ParamSql;
list.RemoveAt(i);
}
else
{
if (list[i].IndexOf(":DATE!") != -)
{
if (list[i].IndexOf(":DATE!") == )
{
ParamSql = "Params[" + ParamIndex.ToString() + "] " + ParamSql;
ParamIndex--;
}
else
{
ParamSql = list[i].Substring(, list[i].IndexOf(":DATE!")) + "Params[" + ParamIndex.ToString() + "] " + ParamSql;
ParamIndex--;
}
}
else
{
if (list[i].IndexOf(":") == )
{
ParamSql = "Params[" + ParamIndex.ToString() + "] " + ParamSql;
ParamIndex--;
}
else
{
ParamSql = list[i].Substring(, list[i].IndexOf(":")) + "Params[" + ParamIndex.ToString() + "] " + ParamSql;
ParamIndex--;
}
}
}
}
//添加控件
if (list.Count > )
{
//坐标初始化
Point point = new Point(, );
//控件行数
int intRow = ;
//以6个参数为一行,初始化控件面板的高度。
splitContainer2.SplitterDistance = * Convert.ToInt32(Math.Ceiling(list.Count / 6.0));
//控件添加
ParamIndex = - list.Count + ;
for (int i = ; i < list.Count; i++)
{
string strLabelText = string.Empty;
if (i % == && i != )
{
intRow++;
point.X = ;
point.Y = + * intRow;
}
//日期及文本
if (list[i].IndexOf(":DATE!") != -)
{
//Label
strLabelText = list[i].Substring(list[i].IndexOf(":DATE!") + , list[i].Length - list[i].IndexOf(":DATE!") - );
Label label = new Label();
label.Name = "Label" + i.ToString();
label.Text = strLabelText;
label.AutoSize = true;
label.Location = point;
splitContainer2.Panel1.Controls.Add(label);
//DateTimePicker
DateTimePicker dateTimePicker = new DateTimePicker();
dateTimePicker.Name = "Params[" + ParamIndex.ToString() + "]";
dateTimePicker.Format = DateTimePickerFormat.Custom;
dateTimePicker.CustomFormat = "yyyy-MM-dd";
dateTimePicker.Width = ;
point.X = point.X + label.Width + ;
point.Y = label.Location.Y - ;
dateTimePicker.Location = point;
splitContainer2.Panel1.Controls.Add(dateTimePicker);
//坐标初始化
point.X += ;
point.Y = label.Location.Y;
}
else
{
//Label
strLabelText = list[i].Substring(list[i].IndexOf(":") + , list[i].Length - list[i].IndexOf(":") - );
Label label = new Label();
label.Name = "Label" + i.ToString();
label.Text = strLabelText;
label.AutoSize = true;
label.Location = point;
splitContainer2.Panel1.Controls.Add(label);
//TextBox
TextBox textBox = new TextBox();
textBox.Name = "Params[" + ParamIndex.ToString() + "]";
textBox.Text = string.Empty;
textBox.Width = ;
point.X = point.X + label.Width + ;
point.Y = label.Location.Y - ;
textBox.Location = point;
splitContainer2.Panel1.Controls.Add(textBox);
//坐标初始化
point.X += ;
point.Y = label.Location.Y;
}
//参数序号赋值
ParamIndex++;
}
}
}
//数据源初始化
dataGridView1.DataSource = null;
}

  好了,分享就到这里,希望对大家有一些帮助。

c#依参数自动生成控件的更多相关文章

  1. 嵌套在母版页中的repeater自动生成控件ID

    注:如果直接在后台通过e.Item.FindControl()方法直接找控件,然后再通过对其ID赋值,在编译之后会出现“母版页名称_ID“类似的很长的ID值(详情点击) 解决方法:<asp:Co ...

  2. Silverlight动态生成控件实例

    刚学习Silverlight,做了一个动态创建控件的实例 实现结果:根据已有的控件类名称,得到控件的实例化对象 实现思路1:就是定义一个模板文件,将类名做为参数,在silverlight中使用Srea ...

  3. Atitit.auto complete 自动完成控件的实现总结

    Atitit.auto complete  自动完成控件的实现总结 1. 框架选型 1 2. 自动完成控件的ioc设置 1 3. Liger  自动完成控件问题 1 4. 官网上的code有问题,不能 ...

  4. Asp.net web form 动态生成控件的注意事项

    Asp.net页面生命周期 页面初始化          Page_Init   加载View State      LoadViewState    回发数据处理      LoadPostData ...

  5. C#控件数组批量生成控件

    在编写C#窗体应用程序的时候,有时候需要生成好多个功能相似的同一种控件(比如数字键盘按键.单选框等),这时候使用窗体编辑器,费时费力,不便于修改.因此可以采用批量生成控件的形式. 以批量生成按钮为例 ...

  6. Asp.net中使用文本框的值动态生成控件的方法

    这篇文章主要介绍了Asp.net中使用文本框的值动态生成控件的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下 看到一个网友,有论坛上问及,动态的生成checkbox控件,在文本框中输入一个“花 ...

  7. WPF: WrapPanel 容器的数据绑定(动态生成控件、遍历)

    原文:WPF: WrapPanel 容器的数据绑定(动态生成控件.遍历) 问题:        有一些CheckBox需要作为选项添加到页面上,但是数目不定.而为了方便排版,我选择用WrapPanel ...

  8. Winforn中使用代码动态生成控件

    场景 有时候需要根据配置文件在窗体中使用代码动态生成控件. 比如读取xml配置文件中的节点数量,然后在窗体中生成指定数量的RadioGroup控件. 实现 新建一个窗体,在窗体的加载完之后的事件中 p ...

  9. winform 自定义自动完成控件

    做过前端的朋友肯定很清楚自动完成控件,很多优秀的前端框架都会带有自动完成控件,同样的,winform也有,在我们的TextBox和ComboBox中,只需要设置AutoCompleteSource属性 ...

随机推荐

  1. Python之路(第三篇):Python基本数据类型字符串(二)

    一.基本数据类型1.字符串 str字符串方法介绍(二)a --expandtabs( ) expandtabs( ) 把字符串中的 tab 符号('\t')转为空格参数默认为8,注意字符串原有的空格也 ...

  2. python 字符串占位符的使用

    name2='我是{} 我的专业是 {}'.format('张三','计算机科学技术')print(name2)

  3. muduo 的windows下的编译

    四处寻觅开源代码学习,适合的代码非常稀少,不适合的原因却千奇百怪. 不是使用语言特性过于老旧(c++03) 就是使用的冷僻语法(template<T> enable_share_from_ ...

  4. Exception 异常 输出的各个方法的区别

    try{ System.out.println(1/0); }catch(Exception e){ //System.out.println(e+""); //对象+字符串 = ...

  5. oracle的常用99条语句

    1. select * from emp; 2. select empno, ename, job from emp; 3. select empno 编号, ename 姓名, job 工作 fro ...

  6. 在ugui上显示3d物体

    1.接下来,使Cube的Layer和背景一样为UI层, 2.在将我们的主相机culling Mask改为UI,如果你还想渲染其他层的物体,可以根据需要该为需要的层,或者直接改为Everyting 3. ...

  7. 2018.12.31 NOIP训练 czy的后宫6(线性dp)

    传送门 题意简述:给一个nnn个数的数列,你可以把它最多分成mmm段,求每段数之和的最大值的最小值,以及满足这个最小值的时候划分数列的方案数. 思路:第一个问题是二分经典问题,不妨设其答案为limli ...

  8. 2018.11.09 codeforces487E. Tourists(tarjan+树链剖分)

    传送门 先把边双连通分量用圆方树一样的方法缩点,然后把新建的树树剖维护. 注意对于边双连通分量需要维护动态最小值,可以用multisetmultisetmultiset. 代码: #include&l ...

  9. flask 知识积累

    PythonWEB框架之Flask Flask快速入门,知识整理 Flask 框架

  10. springboot+mysql实现quartz集群搭建

    一.基本概念 Quartz核心的概念:scheduler任务调度.Job任务.Trigger触发器.JobDetail任务细节. scheduler任务调度: 是最核心的概念,需要把JobDetail ...