DataGridView控件初始化,添加删除行(不绑定数据库)
转载:
http://blog.163.com/zjlovety@126/blog/static/2241862420106128264300/
也不知道是否该应用这个控件,不过也想不出该用其他什么控件,关键是俺比较菜没什么经验。
要求是这样的,用户一次添加一个任务,这个任务有三个选项,其中两个选项是用户动态输入的名称(就象图中bb和dd两列),另一个选项则是一堆数据(就象qq那列),我现在要把每个任务罗列出来,不能用treeview,不能用tabcontrol,不能用xml,最好象个表格一样清晰明朗(疯了!)每个任务对应两个按钮,一个是Run,为了跑任务,一个是Remove,为了移除任务。
当然最开始选择DataGridView就是为了满足那个“象表格一样清晰明朗”的奇怪需求,一行对应一个任务,其次貌似DataGridView控件在.net 2.0中加入了新的特征如DataGridViewButtonColumn啊,DataGridViewComboBoxColumn之类的东东。研究了一天才发现这两个东东根本派不上用场,首先DataGridViewButtonColumn中的Button跟真的Button根本没得比,既不能添加Button的Text也不好添加Click事件(应该是有方法的但还是很别扭而且也没研究);其次是DataGridViewComboBoxColumn,不仅外观上不能和真正的ComboBox相提并论,而且当你选择了其中的任一item,DataGridView就会新增一行,这跟我们的需求是完全不符合的,毕竟一个选项是不能代表一个任务的。
从网上查了很多资料,呵呵,看到一篇说可以画个控件上去,觉得很有意思。其实我就是这么做的。
(1)首先初始化DataGridView控件。
private void Form1_Load(object sender, EventArgs e)
{
DataGridViewCellStyle columnHeaderStyle = new DataGridViewCellStyle();
columnHeaderStyle.BackColor = Color.Beige;
columnHeaderStyle.Font = new Font("Verdana", 10, FontStyle.Bold);
dataGridView1.ColumnHeadersDefaultCellStyle = columnHeaderStyle;
this.dataGridView1.Columns.Add("1", "bb");
this.dataGridView1.Columns.Add("2", "qq");
this.dataGridView1.Columns.Add("3", "dd");
this.dataGridView1.Columns.Add("4", "aa");
}
(2)单击按钮添加一行,包括单元格和单元格的值,看似内嵌在单元格中的按钮和下拉列表
private void button4_Click(object sender, EventArgs e)
{
DataGridViewRow dr = new DataGridViewRow();
foreach (DataGridViewColumn c in this.dataGridView1.Columns)
{
dr.Cells.Add(c.CellTemplate.Clone() as DataGridViewCell); //给行添加单元格
}
dr.Cells[0].Value = "1111";
dr.Cells[2].Value = "3333";
this.dataGridView1.Rows.Add(dr);
int index = this.dataGridView1.Rows.Count - 2;
ComboBox com = new ComboBox();
com.Name = "Containers" + index.ToString(); ;
com.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
com.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
com.Items.AddRange(new object[] {
"1",
"2",
"3",
"4"});
com.SelectedIndex = 0;
this.dataGridView1.Controls.Add(com);
this.dataGridView1.Columns[1].Width = com.Width;
com.Location = newSystem.Drawing.Point(((this.dataGridView1.GetCellDisplayRectangle(1, index,true).Right) - (com.Width)), this.dataGridView1.GetCellDisplayRectangle(1, index,true).Y);
Button btn1 = new Button();
btn1.Name = "btnRun" + index.ToString(); ;
btn1.Text = "Run";
btn1.Click+=new EventHandler(btn1_Click);
Button btn2 = new Button();
btn2.Name = "btnRemove"+index.ToString();
btn2.Text = "Remove";
btn2.Click+=new EventHandler(btn2_Click);
this.dataGridView1.Controls.Add(btn1);
this.dataGridView1.Controls.Add(btn2);
this.dataGridView1.Columns[3].Width = btn1.Width + btn2.Width + 6;
btn1.Location = newSystem.Drawing.Point(((this.dataGridView1.GetCellDisplayRectangle(3, index,true).Left)), this.dataGridView1.GetCellDisplayRectangle(3, index, true).Y);
btn2.Location = new System.Drawing.Point(((this.dataGridView1.GetCellDisplayRectangle(3, index,true).Right-1) - (btn2.Width)), this.dataGridView1.GetCellDisplayRectangle(3, index,true).Y);
}
(3)为(2)中生成的Run按钮和Remove按钮添加单击事件处理程序
public void btn1_Click(object sender, EventArgs e)
{
this.richTextBox1.Text = "";
Button btn = (Button)(sender);
//这个btn的name是btnRun打头的
string suffix = btn.Name.ToString().Substring(6); //后边那个号,相当于index的string
Control c = findControlByName(suffix);
if (c != null)
{
ComboBox com = (ComboBox)(c);
//Control ctl1 = this.dataGridView1.Controls["Containers" + i.ToString()];
//ComboBox com = (ComboBox)ctl1; 其实这样写更简单点
for (int i = 0; i < com.Items.Count; i++)
{
this.richTextBox1.Text += com.Items[i].ToString() + "\n";
}
}
}
public void btn2_Click(object sender, EventArgs e)
{
int RowCount = this.dataGridView1.Rows.Count;
Button btn = (Button)(sender);
//这个btn的name是btnRemove打头的
string suffix = btn.Name.ToString().Substring(9); //后边那个号,相当于index的string
this.dataGridView1.Controls.RemoveByKey(btn.Name);
this.dataGridView1.Controls.RemoveByKey("btnRun" + suffix);
this.dataGridView1.Controls.RemoveByKey("Containers" + suffix);
int index = Convert.ToInt32(suffix);
this.dataGridView1.Rows.RemoveAt(index);
if (index < RowCount - 2)
{
for (int i = index + 1; i < RowCount - 1; i++)
{
Control ctl1 = this.dataGridView1.Controls["Containers" + i.ToString()];
Control ctl2 = this.dataGridView1.Controls["btnRun" + i.ToString()];
Control ctl3 = this.dataGridView1.Controls["btnRemove" + i.ToString()];
ComboBox com = (ComboBox)ctl1;
Button btnRun = (Button)ctl2;
Button btnRemove = (Button)ctl3;
//上移一格,单元格Height位4,Button的Height为23
com.Location = new System.Drawing.Point(com.Location.X, com.Location.Y - 23);
btnRun.Location = new System.Drawing.Point(btnRun.Location.X, btnRun.Location.Y - 23);
btnRemove.Location = new System.Drawing.Point(btnRemove.Location.X, btnRemove.Location.Y - 23);
//改名字的后缀
int j=i-1;
com.Name = "Containers" + j.ToString();
btnRun.Name = "btnRun" + j.ToString();
btnRemove.Name = "btnRemove" + j.ToString();
}
}
}
(4)btn1_Click处理中用到的函数findControlByName()
public Control findControlByName(string suffix)
{
foreach (System.Windows.Forms.Control c in this.dataGridView1.Controls)
{
if (c.Name == "Containers" + suffix)
return c;
}
return null;
}
写的比较累赘,不知道还有什么更好的方法。请经验人士赐教^_^
转载于:https://www.cnblogs.com/timeover/archive/2010/09/15/1826900.html
DataGridView控件初始化,添加删除行(不绑定数据库)相关推荐
- 转——C# DataGridView控件 动态添加新行
DataGridView控件在实际应用中非常实用,特别需要表格显示数据时.可以静态绑定数据源,这样就自动为DataGridView控件添加相应的行.假如需要动态为DataGridView控件添加新行, ...
- C# DataGridView控件动态添加新行
目录 方法一: 方法二: ① DataGridView 取得或者修改当前单元格的内容: ② DataGridView 设定单元格只读: ③ DataGridView 不显示最下面的新行: ④ Data ...
- ASP.NET中DropDownList控件的简单使用--DDL绑定数据库表中值,选择DDL中值直接检索数据...
1.在.aspx页面拖入DropDownList控件 <label class="txt-green">校区:</label> <asp:DropDo ...
- C#中DataGridView控件使用大全
c datagridview 分类: C/C++/C# DataGridView 动态添加新行: DataGridView控件在实际应用中非常实用,特别需要表格显示数据时.可以静态绑定数据源,这样就自 ...
- C# DataGridView控件动态添加行与列
DataGridView控件在实际应用中非常实用,特别需要表格显示数据时.可以静态绑定数据源,这样就自动为DataGridView控件添加相应的行.假如需要动态为DataGridView控件添加新行, ...
- WinForm中关于DataGridView控件的一些应用
转载于新浪 美林居士 的博客: blog.sina.com.cn/s/blog_797a56d20101daiw.html4 在.NET4.0中,以表格形式存储的数据通常是Dat ...
- [ExtJs] 控件初始化绑定事件 initialize 和 painted的区别
在使用ExtJs时,对于一些页面控件在初始化时希望绑定事件用于值修改时触发,通常会在控件初始化或控件展示时绑定. 一般常用的事件主要有initialize.added.beforeshow.activ ...
- vb.net 教程 3-10 窗体编程 datagridview控件 3 禁止追加行 与 禁止删除行
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的. 如<vb.net 教程 3-10 窗体编程 datagridview控件 1 初步 > ...
- Winform实现在DataGridView控件的单元格中添加多个控件
Winform实现在DataGridView控件的单元格中添加多个控件 背景 实现思路 关键代码 完整代码下载 背景 DataGridView控件的列是支持TextBoxColumn.ComboBox ...
最新文章
- php缓存数据到本地缓存,本地缓存localStorage的使用方法
- 读取String数组内的内容
- 对某bc站的一次渗透测试
- 学习笔记二:异步FIFO
- dbgrid 获取前台页面参数
- php在线编辑器_8款功能强大的Java编辑器,建议收藏!「渡一教育」
- MFC:VS拖拽多个文件到控件并获取路径
- Mac上的MySQL可视化工具总结
- 哈佛幸福课 24种人格力量测试
- 移动端Retina屏boder 1px显示为2px或3px的解决方法
- 咸鱼Maya笔记—Maya 编辑法线
- spamhaus反垃圾邮件联盟黑名单PBL申诉详细步骤
- 前端对用户身份证号码进行验证以及模糊显示
- [创业之路-50] :动态股权机制 -5- 创业公司股权分配常见的坑
- QT的QList排序
- JAVA spring hessian_Springboot写的Hessian例子
- 通过各种统计方法建立理想的mlb投球前景
- 考研英语(七)——状语和状语从句
- 数据手册中最小值、最大值、典型值三者之间的关系
- 教你如何搭建人事OA-员工管理系统,demo可分享
热门文章
- css 透明背景_css 中多种边框的实现小窍门
- linux-shell命令之file【辨识文件类型】
- LeetCode Hot100 ---- 动态规划专题
- fort77编译器安装
- spring boot系列 1: 第一个spring boot: Hello prj
- 【语义分割】PSPNet:Pyramid Scene Parsing Network
- 卷积神经网络经典模型要点
- 使用Scikit-learn,Spotify API和Tableau Public进行无监督学习
- 贝叶斯优化神经网络参数_贝叶斯超参数优化:神经网络,TensorFlow,相预测示例
- 使用Python构建推荐系统的机器学习