这是读取GREIDVIEW的代码
1 foreach (Control c in tabControl1.TabPages) 2 { 3 if (c is TabPage) 4 {MessageBox.Show(c.Text); 5 foreach (Control b in c.Controls) 6 { 7 if (b is DataGridView) 8 { 9 10 dtb=GetDgvToTable((DataGridView)b); 11 DataRow[] d = dtb.Select("样地号='" + xx + "'"); 12 DataTable tb = dtb.Clone(); 13 for (int i = 0; i < d.Length; i++) 14 { 15 tb.ImportRow((DataRow)d[i]); 16 } 17 if (b.Name.Equals("AreaPerimeter.txt") || b.Name.Equals("HighRecord.txt") || b.Name.Equals("LocatorTree.txt") || b.Name.Equals("PointMeasure.txt") || b.Name.Equals("Trees.txt")) 18 { 19 getTable(b.Name.ToString(), tb); 20 } 21 else 22 getText(b.Name.ToString(), tb); 23 } 24 } 25 } 26 }
这是TABCONTROL动态添加的代码
1 private void button3_Click(object sender, EventArgs e) 2 { 3 zipPath = treeView1.SelectedNode.Name.Trim(); 4 if (textBox1.Text == "") 5 MessageBox.Show("请选择文件存放地址"); 6 else 7 MessageBox.Show(DownloadFile(zipPath, textBox1.Text.ToString().Trim())+",解码成功!"); 8 9 try 10 { 11 FilePath = textBox1.Text + zipPath.Substring(zipPath.LastIndexOf("\\")) ; 12 exPath = textBox2 .Text .Trim ()+"\\"; 13 ZipInputStream s = new ZipInputStream(File.OpenRead(FilePath)); 14 15 ZipEntry theEntry; 16 string rootDir = ""; 17 string directoryName = ""; 18 19 while ((theEntry = s.GetNextEntry()) != null) 20 { 21 rootDir = Path.GetDirectoryName(theEntry.Name); 22 if (rootDir.IndexOf("\\") >= 0) 23 rootDir = rootDir.Substring(0, rootDir.IndexOf("\\") + 1); 24 25 directoryName = Path.GetDirectoryName(theEntry.Name); 26 string fileName = Path.GetFileName(theEntry.Name); 27 28 if (directoryName != " ") 29 { 30 if (!Directory.Exists(exPath + directoryName)) 31 { 32 directoryName = exPath + directoryName; 33 Directory.CreateDirectory(directoryName); 34 } 35 } 36 //生成解压目录 37 38 39 if (fileName != String.Empty) 40 { 41 //解压文件到指定的目录 42 FileStream streamWriter; 43 if (fileName.Equals("Sample.txt")) 44 { 45 string filePath = theEntry.Name.Substring(0, theEntry.Name.Length - fileName.Length); 46 streamWriter = File.Create(exPath + filePath + "0" + fileName); 47 } 48 else 49 streamWriter = File.Create(exPath + theEntry.Name); 50 51 int size = 2048; 52 byte[] data = new byte[2048]; 53 while (true) 54 { 55 size = s.Read(data, 0, data.Length); 56 if (size > 0) 57 { 58 streamWriter.Write(data, 0, size); 59 } 60 else 61 { 62 break; 63 } 64 } 65 66 streamWriter.Close(); 67 } 68 69 } 70 s.Close(); 71 72 exPath = exPath + rootDir; 73 DirectoryInfo TheFolder = new DirectoryInfo(exPath); 74 //遍历文件 75 foreach (FileInfo NextFile in TheFolder.GetFiles()) 76 { 77 78 TabPage tp = new TabPage(); 79 tp.Text = NextFile.Name; 80 //加子标签 81 tabControl1.TabPages.Add(tp); 82 83 //JSON转DATATABLE 84 FileStream file = new FileStream(exPath + "\\" + NextFile.Name, FileMode.Open, FileAccess.Read); 85 StreamReader sr = new StreamReader(file); 86 sr.BaseStream.Seek(0, SeekOrigin.Begin); 87 string str = sr.ReadLine(); 88 if (str != null) 89 { 90 str = str.Replace(",\"", "*\"").Replace("\":", "\"#").ToString(); 91 DataTable tb = null; 92 93 var rg = new Regex(@"(?<={)[^}]+(?=})"); 94 MatchCollection mc = rg.Matches(str); 95 for (int i = 0; i < mc.Count; i++) 96 { 97 string strRow = mc[i].Value; 98 string[] strRows = strRow.Split('*'); 99 100 if (tb == null) 101 { 102 tb = new DataTable(); 103 foreach (string st in strRows) 104 { 105 var dc = new DataColumn(); 106 string[] strCell = st.Split('#'); 107 108 if (strCell[0].Substring(0, 1) == "\"") 109 { 110 int a = strCell[0].Length; 111 dc.ColumnName = strCell[0].Substring(1, a - 2); 112 } 113 else 114 dc.ColumnName = strCell[0]; 115 tb.Columns. Add(dc); 116 } 117 tb.AcceptChanges(); 118 } 119 120 DataRow dr = tb.NewRow(); 121 for (int r = 0; r < strRows.Length; r++) 122 dr[r] = strRows[r].Split('#')[1].Trim().Replace(",", ",").Replace(":", ":").Replace("\"", ""); 123 124 tb.Rows.Add(dr); 125 tb.AcceptChanges(); 126 } 127 128 sr.Close(); 129 file.Close(); 130 DataGridView dg = new DataGridView(); 131 dg.Dock = DockStyle.Fill; 132 133 if (NextFile.Name.Equals("0Sample.txt")) 134 { 135 dg.CellClick += new System.Windows.Forms.DataGridViewCellEventHandler(dg_CellClick); 136 137 } 138 //DataTable dd = dg.DataSource as DataTable; 139 dg.DataSource = tb; 140 dg.Name = NextFile.Name.ToString(); 141 tp.Controls.Add(dg); 142 } 143 144 //tabControl1.Refresh(); 145 // tabControl1.Select(); 146 } 147 } 148 catch (Exception ex) 149 { 150 MessageBox.Show(ex.Message); 151 } 152 }
这是读GREIDVIEW里数据的代码
1 public DataTable GetDgvToTable(DataGridView dgv) 2 { 3 DataTable dt = new DataTable(); 4 for (int count = 0; count < dgv.Columns.Count; count++) 5 { 6 DataColumn dc = new DataColumn(dgv.Columns[count].Name.ToString()); 7 dt.Columns.Add(dc); 8 } 9 10 for (int row = 0; row < dgv.Rows.Count; row++) 11 { 12 DataRow dr = dt.NewRow(); 13 for (int countsub = 0; countsub < dgv.Columns.Count; countsub++) 14 { 15 dr[countsub] = Convert.ToString(dgv.Rows[row].Cells[countsub].Value); 16 } 17 dt.Rows.Add(dr); 18 } 19 return dt; 20 }
为什么我执行添加代码以后,马上读取数据,第二页的数据是空的?
.net 又是winform,而且连数据库都不用,难道加个断点调试很难吗?
winform,没有数据库,我读取的是JSON。
@张雄超: 那就更容易调试了啊,加断点。。。
@顾晓北: 加哪里?我之前弄过,第一页还是正常的,第二页他就不知道为什么是空的了。
@张雄超: 我哪儿知道你加哪里?断点想加几个就加几个,你是刚自学吗?
139行 dg.DataSource = tb;
你在这句话的前面加一句 dg.DataSource = null;
没用,还是空的,要我每个子页面点击一遍他才有数据。如果别的页面没有点击,页面读取出来的数据就是空的。
@张雄超: 那说明没有触发点击事件噻
135行 dg.CellClick += new System.Windows.Forms.DataGridViewCellEventHandler(dg_CellClick);
下面加一句dg_CellClick(null,null);//手动触发一下,如果需要参数就自己加上
@刘宏玺: 这个点击事件只在第一页中某一单元格被点击的时候执行,而且只有第一页有。而如果没有点击第一页的单元格,直接向导出输出会要求点击的。第一页就像一个条件一下,需要第一页的条件来查询后面数据,然后读取符合的数据。可是所有数据都是空的,都还没查询。
@张雄超: 那你现在的问题是什么?你都说了,需要点击才可以有第二页,那就说明已经实现了啊
你是想第二页有默认数据还是什么意思?
@刘宏玺: 所有页面的数据是我运行以后,就应该存进去了,已经在页面上了。我想要的是,点击第一页的某一条数据,然后根据这个数据查询后面页面里的数据符合的就导出。可是如果我不点击那些子页面(除了第一页),那些子页面里读出来的数据就是空的。
@张雄超: 你说的点击子页面是什么操作,是为了触发事件吗?
还是说你需要的只是
Application.DoEvents();//这句话加在你子页赋值代码后的地方
@刘宏玺: 点击子页面进去查看数据啊。。。。如果我没挨个点击一遍,读取出来就没数据。可是我设置的点击事件是第一页如果有点击样地号这一列的某一行的时候才执行的。从根本来说,我是不需要触发这个事件也应该可以读取所有子页面数据的。
@张雄超: 我也不清楚你现在是出来什么问题了,这可咋整?
@刘宏玺:就是运行(所有子页面数据都应该有了)以后,第一个子页面点击样地号列的某一行来当查询条件,然后读取所有页的数据,根据保存下来的条件进行查询。可是在读取所有页的数据的时候,除了第一页,其他野的数据都是空的。如果我运行,然后查看某些页,然后选查询条件,然后只有我查看过的页能读出数据,其他页的数据都是空的。
@张雄超: 能不能接几个图说明下问题?我有点蒙圈了
@刘宏玺: 这个是运行以后的,因为运行以后就显示第一页,所以第一页数据正常。继续运行以后,因为没有查看第二页,第二页读出的列都变成0了。
看你的描述,应该是数据压根就没有加载。另外,你应该把去数据的方法独立出来,如果数据仅仅是一份,应该存储到全局变量中。
我是运行的时候就加载数据了的。可是如果我不点击子页面,子页面的数据读出来就是空的,点了,就有数据,这是不是Tabcontrol控件的一种特殊性?
@张雄超: 如果你都加载了数据,那么我怀疑是你在获取数据的时候,出现了问题。如果tab没有被点击,那么它里面的控件应该是没有被渲染的。
@幻天芒: 有点不明白渲染的意思,是不点击进去,数据就不加载么?或者不绘制?
@张雄超: 不绘制控件。你可以在获取数据的时候,看看控件是否存在。
PS,很久不用winform,不太确定了,你在遍历控件的时候断点看下就可以确定是不是这问题。
@幻天芒: 能读取到控件,GridView都能读取到,就是读取GridView内数据的时候是空的。
@张雄超: 你就在初始化Grid的时候断点,看数据进去了没有嘛。这种问题,借助断点应该非常容易定位的。
断点调试看看你点击第二页的时候传入什么参数,是第二页的数据取到了没有绑定上去还是没有取到第二页的数据