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

  

  如上图,一条查询语句当中,包含了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. 原生js的dom操作

    父节点parentNode 第一个子节点 只会获取到元素节点 firstElementChild ★★★★★    ​ 第一个子节点 (如果有文本节点将会获取到文本节点) firstChild ​ 最 ...

  2. mysql 5.7.10 下互为主备配置

    mysql安装方法这里就不在介绍,网上有很多教程 环境介绍: A主机: win2008_x64+mysql5.7.10 64位,ip192.168.7.180 B主机: win2008_x64+mys ...

  3. system v 共享内存

    #include <stdio.h> #include <string.h> #include <errno.h> #include <unistd.h> ...

  4. socket的同步异步的性能差别,以及listen的参数backlog

    先说listen的参数backlog,同步系统中分别设置为5,512,1024的跑分情况 跑分工具apache的ab,参数为:ab -n50000 -c300 backlog=5跑分结果 Reques ...

  5. php代码中pre的作用??

  6. 普通用户修改.bash_profile 权限问题

    例如oracle用户想要修改它下面的.bash_profile文件: 在命令行运行: [root@localhost ~]# ls -lh /home/oracle/.bash_profile

  7. openstack路由管理命令

    1.命令一览 [root@cc07 ~]# neutron help | grep route bgp-speaker-advertiseroute-list List routes advertis ...

  8. .Net 导出Excel时设置单元格的格式为文本类型

    <td style= 'vnd.ms-excel.numberformat:@ ' align='right'>" & Format(Val(rowTitle.Item( ...

  9. GPS 编程笔记

    1.在GPS系统内,经纬度的显示方式一般都可以根据自己的爱好选择,一般有"hddd.ddddd"(度.度),"hddd*mm.mmm"(度.分. 分),&quo ...

  10. 实战--利用SVM对基因表达标本是否癌变的预测

    利用支持向量机对基因表达标本是否癌变的预测 As we mentioned earlier, gene expression analysis has a wide variety of applic ...