程序如下,第一个函数把第1列相同的项隐藏起来只显示第一个,并且在7列标志处总共项,第一个方法在点击了首列的“+”后根据第七列的数据将下面隐藏的行都显示出来,“-”全部隐藏。从程序输出可以看到各行的属性已经修改,但是显示的界面上却没有吧隐藏项显示出来。private void button1_Click(object sender, EventArgs e)
{
GetIconClass gic = new GetIconClass();
Icon ico;
List<Item> items = new List<Item>();
getPort test = new getPort();
items = test.update();
if (items != null)
{
for (int i = 0; i < items.Count; i++)
{
dataGridView1.Rows.Add();
ico = gic.GetIconByFileName(items[i].fileName);
if (ico == null)
ico = gic.GetIconByFileType(".exe",true);
dataGridView1[0, i].Value = ico;
dataGridView1[1, i].Value = items[i].processName;
dataGridView1[2, i].Value = items[i].port;
dataGridView1[7, i].Value = 1;
if (i != 0)
{
Console.WriteLine("i is not 0");
if (dataGridView1[1, i].Value.Equals(dataGridView1[1, i - 1].Value))
{
Console.WriteLine("here is a equel");
if (dataGridView1.Rows[i - 1].Visible == true)
{
dataGridView1[7, i - 1].Value = dataGridView1[7, i].Value = 2;
dataGridView1.Rows[i].Visible = false;
dataGridView1.Rows[i - 1].HeaderCell.Value = "+";
}
else {
int c=int.Parse(dataGridView1[7, i - 1].Value.ToString());
for (int j = (i-c); j <= i; j++)
{
dataGridView1[7,j].Value=c+1;
}
dataGridView1.Rows[i].Visible = false;
}
}
}
}
}
} private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
int count = 1;
int row=e.RowIndex;
Console.WriteLine("row:"+row);
int col=e.ColumnIndex;
if (col == -1)
{
DataGridViewCell cell = dataGridView1.Rows[row].HeaderCell;
if (cell.Value == null)
{
return;
}
if (cell.Value.ToString() == "+")
{
Console.WriteLine("+:"+cell.Value.ToString());
count = int.Parse(dataGridView1[7, row].Value.ToString());
Console.WriteLine("count:" + count);
for (int j = 1; j < count; j++)
{
if (dataGridView1.Rows[row + j].Visible == false)
{
Console.WriteLine("hidden:" + j);
}
else {
Console.WriteLine("nothidden:" + j);
}
DataGridViewBand band = dataGridView1.Rows[row];
band.Visible = true;
//dataGridView1.Rows[row + j].Visible = true;
}
dataGridView1.Rows[row].HeaderCell.Value = "-";
}
if (cell.Value.ToString() == "-")
{
count = int.Parse(dataGridView1[7, row].Value.ToString());
for (int j = 1; j < count; j++)
{
dataGridView1.Rows[row + j].Visible = false;
}
dataGridView1.Rows[row].HeaderCell.Value = "+";
}
Console.WriteLine("no:"+cell.Value.ToString());
}
}
{
GetIconClass gic = new GetIconClass();
Icon ico;
List<Item> items = new List<Item>();
getPort test = new getPort();
items = test.update();
if (items != null)
{
for (int i = 0; i < items.Count; i++)
{
dataGridView1.Rows.Add();
ico = gic.GetIconByFileName(items[i].fileName);
if (ico == null)
ico = gic.GetIconByFileType(".exe",true);
dataGridView1[0, i].Value = ico;
dataGridView1[1, i].Value = items[i].processName;
dataGridView1[2, i].Value = items[i].port;
dataGridView1[7, i].Value = 1;
if (i != 0)
{
Console.WriteLine("i is not 0");
if (dataGridView1[1, i].Value.Equals(dataGridView1[1, i - 1].Value))
{
Console.WriteLine("here is a equel");
if (dataGridView1.Rows[i - 1].Visible == true)
{
dataGridView1[7, i - 1].Value = dataGridView1[7, i].Value = 2;
dataGridView1.Rows[i].Visible = false;
dataGridView1.Rows[i - 1].HeaderCell.Value = "+";
}
else {
int c=int.Parse(dataGridView1[7, i - 1].Value.ToString());
for (int j = (i-c); j <= i; j++)
{
dataGridView1[7,j].Value=c+1;
}
dataGridView1.Rows[i].Visible = false;
}
}
}
}
}
} private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
int count = 1;
int row=e.RowIndex;
Console.WriteLine("row:"+row);
int col=e.ColumnIndex;
if (col == -1)
{
DataGridViewCell cell = dataGridView1.Rows[row].HeaderCell;
if (cell.Value == null)
{
return;
}
if (cell.Value.ToString() == "+")
{
Console.WriteLine("+:"+cell.Value.ToString());
count = int.Parse(dataGridView1[7, row].Value.ToString());
Console.WriteLine("count:" + count);
for (int j = 1; j < count; j++)
{
if (dataGridView1.Rows[row + j].Visible == false)
{
Console.WriteLine("hidden:" + j);
}
else {
Console.WriteLine("nothidden:" + j);
}
DataGridViewBand band = dataGridView1.Rows[row];
band.Visible = true;
//dataGridView1.Rows[row + j].Visible = true;
}
dataGridView1.Rows[row].HeaderCell.Value = "-";
}
if (cell.Value.ToString() == "-")
{
count = int.Parse(dataGridView1[7, row].Value.ToString());
for (int j = 1; j < count; j++)
{
dataGridView1.Rows[row + j].Visible = false;
}
dataGridView1.Rows[row].HeaderCell.Value = "+";
}
Console.WriteLine("no:"+cell.Value.ToString());
}
}
基础啊
你们在WinForm里写Console.WriteLine,看看输出窗口里输出的是什么,不会还说别人吗?
当然可以这么做。结果就是一个下午给你折腾掉,写出一堆垃圾代码。难道你不知道怎么调试么?正确地输出调试结果应该输出到哪里么?system.diagnostics.debug.writeline() 为什么不用呢?初学者经常跟我讲这个这么这么不是也能弄出来吗。基础不打牢,天天在网上搜索破烂代码,往筐里面装,还振振有词。
往往一个稍微大一点的程序,输出是很多的。你除错的时候全部加上,编译的时候全部去掉,到时候搞不清楚,造成很不易发现的错误。所以说把新手派去参加开发的后果就是帮倒忙。
然后,如caozhy所说,在调试的时候的确不应该用console.writeln(),应该用system.diagnostics.debug.writeline()。debug类中所有函数的调用都不会在release版本里有效。也就是说,我们通过这种方法所加的代码可以仅用于调试;在发布的时候无需删任何代码,就可以给用户一个没有调试指令的程序了。对于大工程的确很省事。
最后,基础真的很重要,特殊情况才选择了不熟悉的C#,时间匆忙没看什么书,做起来很费力。不过实践也很重要,可能你读书破万卷,没有试过还真不知道console.writeln()也可以输出。
谢谢大家的指教!