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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261808.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 不同分区 同时insert_Mysql分区表的原理和优缺点

分区表的原理分区表是由多个相关的底层表实现&#xff0c;这些底层表也是由句柄对象表示&#xff0c;所以我们也可以直接访问各个分区&#xff0c;存储引擎管理分区的各个底层表和管理普通表一样(所有的底层表都必须使用相同的存储引擎)&#xff0c;分区表的索引只是在各个底层…

计算机应用 范文,计算机应用基础(范文).doc

第 PAGE \* Arabic 1 页计算机应用基础(范文)PAGE计算机应用基础5一、单选题1、第一台电子计算机是1946年在美国研制成功的&#xff0c;该机的英文缩写名是_ A&#xff1a;ENIAC _____。2、关于计算机的分类方法有多种&#xff0c;下列选项中不属于按计算机处理数据的方式进行分…

架构漫谈(八):从架构的角度看如何写好代码

2016-03-03 王概凯Kevin 聊聊架构架构漫谈是由资深架构师王概凯Kevin执笔的系列专栏&#xff0c;专栏将会以Kevin的架构经验为基础&#xff0c;逐步讨论什么是架构、怎样做好架构、软件架构如何落地、如何写好程序等问题。 本文是漫谈架构专栏的第八篇&#xff0c;作者Kevin举例…

大理三塔,及崇圣寺里的假深沉

大理三塔&#xff0c;及崇圣寺里的假深沉 记得我第一次看见三塔时&#xff0c;是一副破败不堪的景象。而第二次来大理时&#xff0c;因为“崇圣寺”正在修葺&#xff0c;只能远远地眺望一下三塔。那时我对大理失望极了。 现在三塔修缮一新&#xff0c;给人耳目一新的感觉。 三塔…

WCF三种通信模式(转)

一、概述 WCF在通信过程中有三种模式&#xff1a;请求与答复、单向、双工通信。以下我们一一介绍。 二、请求与答复模式 描述&#xff1a; 客户端发送请求&#xff0c;然后一直等待服务端的响应(异步调用除外)&#xff0c;期间处于假死状态&#xff0c;直到服务端有了答复后才能…

python语言打印菱形_Python打印菱形

使用python打印出菱形&#xff1a;*************************思想&#xff1a;平常我写这种代码的时候&#xff0c;总是自然地使用二层循环&#xff0c;今天老师教了一个特别好的方法&#xff0c;化二维为一维。我觉得代码优化是很重要的&#xff0c;所以把它写下来&#xff0c…

计算机软件及应用stata,蒙特卡洛模拟及其Stata应用实现

蒙特卡洛模拟及其Stata应用实现出版时间&#xff1a;2015年版丛编项&#xff1a;海南大学经济管理系列丛书内容简介《蒙特卡洛模拟及其Stata应用实现》的第1章是Stata软件基础&#xff0c;主要介绍了Stata软件的一些基本功能与操作。第2章介绍了Stata软件的语法结构&#xff0c…

第一个程序,Hello World

在eclipse里新建一个project&#xff0c;选Android-Android Project 然后Next,继续 解释一下 Package Name&#xff1a;这个学过编程的人都应该熟悉了&#xff0c;类似于namespace&#xff0c;你定义的所有东西都在一个包里不会和别的包出现重命名的问题等等&#xff0c;不多说…

Hadoop2.6集群动态添加和删除数据节点

2019独角兽企业重金招聘Python工程师标准>>> 开始之前&#xff0c;应该把所有新增数据节点上的Hadoop环境都配置好&#xff08;如果要直接复制已经存在节点的hadoop文件夹&#xff0c;应该删掉里面已经产生的集群数据&#xff0c;比如tmp和data目录&#xff0c;不然…

读操作系统的设计与实现--进程互斥

1.竞争条件 当两个或多个进程读写某些共享数据时&#xff0c;而最后的结果取决于进程的运行顺序时&#xff0c;这就称为竞争条件。包含竞争条件的程序&#xff0c;大多数时候运行结果良好&#xff0c;但是往往会发生一些无法解释的结果。事实上&#xff0c;只要涉及到共享资源的…

拉取ftp服务器上的文件_winscp和云服务器,2步实现winscp将文件上传到腾讯云Linux云服务器...

WinSCP是一个Windows环境下使用SSH的开源图形化SFTP客户端。同时支持SCP协议&#xff0c;它的主要功能就是在本地与远程计算机间安全的复制文件。与使用FTP上传代码相比&#xff0c;通过WinSCP可以直接使用服务器账户密码访问云服务器&#xff0c;无需在服务器端做任何配置。II…

计算机技术qq交流群,专业计算机群QQ

我想学习计算机的程序没什么基础 应该怎么做学什么 要怎么样才可以学好楼上的说得不对,直接学C就可以了,C不用学得太深,学些基本语法,然后转学C,因为C是面向对象的编程思想,把C的基础编程弄明白以后,可以从Visual C,C#,C。Net中选一项来学,先学些基础的,然后做些小项目,然后可以…

笔记:设计模式(3)-Abstract Factory抽象工厂模式

工厂模式的起源 1.变化点在“对象的创建”&#xff0c;因此就封装“对象创建”&#xff1b; 2.面向接口编程&#xff0c;依赖接口&#xff0c;而非依赖实现。 动机&#xff08;Motivation&#xff09; 在系统中&#xff0c;经常面临着“一系列相互以来的对象”的创建工作&#…

MongoDB操作:insert()

2019独角兽企业重金招聘Python工程师标准>>> Override public boolean inSert(String dbName, String collectionName, String[] keys,Object[] values) { DB db null; DBCollection dbCollection null; WriteResult result null; String resul…

python文件批量改名_python文件批量重命名

python文件批量重命名代码如下&#xff1a;# -*- coding: gbk -*-import osclass fileRename():def __init__(self, path):self.__path pathself.__order {}self.__files os.listdir(path)def list(self):return self.__filesdef presolve(self, string):for _ in string.sp…

内存管理简介之Buddy算法和slab分配

1.Buddy算法linux对空闲内存空间管理采取buddy算法&#xff0c;Buddy算法&#xff1a;把内存中所有页面按照2^n划分&#xff0c;其中n0~5&#xff0c;每个内存空间按1个页面、2个页面、4个页面、8个页面、16个页面、32个页面进行六次划分。划分后形成了大小不等的存储块&#x…

人工操作阶段计算机是如何工作的,管理信息系统作业参考答案

(一)、单项选择题1. 系统实施阶段的主要内容之一是(A)。A.系统物理配置方案的设计 B.输入设计C.程序设计 D.输出设计2. 结构化方法中&#xff0c;自顶向下原则的确切含义是(A)A 先处理上级机关事务&#xff0c;再处理下级机关事务B 先进行总体设计&#xff0c;后进行详细设计C …

最近处理的几个小问题_20160311

最近处理的小问题很多&#xff0c;我就拿出来几个&#xff0c;简单和大家说一说。我就分为三个方面&#xff0c;硬件问题&#xff0c;Oracle表空间迁移&#xff0c;MySQL断电恢复首先是硬件问题。如果看到下面的系统日志&#xff0c;就会发现早在2014年就出现了一些警告和问题&…

3. 什么是icmp?icmp与ip的关系_你知道如何跟女生,确定恋人关系吗?

哈喽&#xff01;同学你好&#xff01;我是子伯&#xff0c;是一名情感咨询。今天我想给你分享&#xff0c;和女生再暧昧期&#xff0c;如何去确定关系&#xff0c;因为......在我做咨询当中&#xff0c;有很多男生跟女生&#xff0c;不管是在聊天上&#xff0c;还是在线下的交…

量子计算机完整的图片,记者带你走近世界首台超越早期经典计算机的光量子计算机(组图)...

在光学体系方面&#xff0c;研究团队在去年首次实现十光子纠缠操纵的基础上&#xff0c;利用高品质量子点单光子源构建了世界首台超越早期经典计算机的单光子量子计算机。图为基于单光子的量子计算原型机结构。潘建伟教授供图据了解&#xff0c;多粒子纠缠的操纵作为量子计算的…