dictionary 只能遍历最后一个

IT-学徒 2012-06-13 04:03:30
OneAnnal()//是加载一条记录函数

private void butAdd_Click(object sender, EventArgs e)
{//添加按钮
if (estimate())
{
OneAnnal();
liquidation();//清空
singers.Add(singer.Stunumber,singer);//把每条记录加载到 singers
}
}

private void butSave_Click(object sender, EventArgs e)
{//保存按钮,保存到Excel
string fileName = Application.StartupPath + "\\data\\"+classNumber+".xls";//获取文件路径
//加载excel
MSExcel.Application excelApp;
MSExcel.Workbook excelDoc;
excelApp = new MSExcel.ApplicationClass();
Object Nothing = Missing.Value;
excelDoc = excelApp.Workbooks.Add(Nothing);
MSExcel.Worksheet ws = (MSExcel.Worksheet)excelDoc.Sheets[1];

int i = 3;//从第三行开始写入
foreach (Basis oneL in singers.Values)
{//遍历dictionary
ws.Cells[i, 1] = oneL.Stunumber;
ws.Columns.AutoFit();//自动调整宽度
ws.Cells[i, 2] = oneL.Stuname;
ws.Columns.AutoFit();
ws.Cells[i, 3] = oneL.Idcard;
ws.Columns.AutoFit();
ws.Cells[i, 4] = oneL.Sex;
ws.Columns.AutoFit();
ws.Cells[i, 5] = oneL.Birthrate;
ws.Columns.AutoFit();
ws.Cells[i, 6] = oneL.Nation;
ws.Columns.AutoFit();
ws.Cells[i, 7] = oneL.Handsetnumber;
ws.Columns.AutoFit();
ws.Cells[i, 8] = oneL.QQ;
ws.Columns.AutoFit();
ws.Cells[i, 9] = oneL.Bedchamber;
ws.Columns.AutoFit();
ws.Cells[i, 10] = oneL.Houseaddress;
ws.Columns.AutoFit();
ws.Cells[i, 11] = i.ToString();
i++;//行数增加
}

现在写到excel都是最后一条记录
...全文
276 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
IT-学徒 2012-06-15
  • 打赏
  • 举报
回复
谢谢,
__天涯寻梦 2012-06-13
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]
引用 14 楼 的回复:
butAdd_Click 方法里加上下面红字那行
private void butAdd_Click(object sender, EventArgs e)
{//添加按钮
if (estimate())
{
singer = new Basis();
OneAnnal();
liquidation();//清空
singers.Add(singer.S……
[/Quote]
singer 虽是全局变量,但是它是引用类型,不论执行多少次 singers.Add 都是在重复添加同一个实例,OneAnnal 方法只是把它内容不断得修改了,所以在 OneAnnal 和 singers.Add 之前对 singer 重新实例化,让 singers.Add 添加与之前不同的实例。
IT-学徒 2012-06-13
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]
butAdd_Click 方法里加上下面红字那行
private void butAdd_Click(object sender, EventArgs e)
{//添加按钮
if (estimate())
{
singer = new Basis();
OneAnnal();
liquidation();//清空
singers.Add(singer.Stu……
[/Quote]

谢谢,但是我不知道为什么要这样做, singer不是定义了一个全局变量吗?
__天涯寻梦 2012-06-13
  • 打赏
  • 举报
回复
butAdd_Click 方法里加上下面红字那行
private void butAdd_Click(object sender, EventArgs e)
{//添加按钮
if (estimate())
{
singer = new Basis();
OneAnnal();
liquidation();//清空
singers.Add(singer.Stunumber, singer);
......
IT-学徒 2012-06-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
C# code
singers.Add(singer.Stunumber,singer);//把每条记录加载到 singers

这里我没有看到循环,仅添加了一个singer元素,你怎么说是每条记录?哪来的那么多条啊
[/Quote]

每单击一次添加按钮就添加一条记录,把全部记录添加后,再保存
下面代码

Basis 是自定义类
Dictionary<string, Basis> singers = new Dictionary<string, Basis>();
Basis singer = new Basis();

private void OneAnnal()
{ //加载一条记录
singer.Stunumber = txtStuNumber.Text;
singer.Stuname = txtStuName.Text;
singer.Idcard = txtIdCard.Text;
singer.Sex = int.Parse(txtIdCard.Text.Substring(16, 1)) % 2 == 1 ? "男" : "女";
singer.Birthrate = comYear.Text + "." + comMonth.Text + "." + comDay.Text;
singer.Nation = comNation.Text;
singer.Handsetnumber = txtHandsetnumber.Text;
singer.QQ = txtQQ.Text;
singer.Bedchamber = txtBedchamber.Text;
singer.Houseaddress = txtHouseAddress.Text;
}

private void butAdd_Click(object sender, EventArgs e)
{//添加按钮
if (estimate())
{
OneAnnal();
liquidation();//清空
singers.Add(singer.Stunumber,singer);
ListViewItem lv = new ListViewItem(singer.Stunumber);
lv.SubItems.AddRange(new string[]{singer.Stuname,singer.Idcard,singer.Sex,
singer.Birthrate,singer.Nation,singer.Handsetnumber,singer.QQ,
singer.Bedchamber,singer.Houseaddress});
listView1.Items.Add(lv);
}
butSave.Enabled = true;
}

private void butSave_Click(object sender, EventArgs e)
{//保存按钮,保存到Excel
string fileName = Application.StartupPath + "\\data\\"+classNumber+".xls";//获取文件路径
if(File.Exists(fileName))
{//如果文件已存在
DialogResult dr = MessageBox.Show("文件已存在,是否删除","提示",MessageBoxButtons.YesNo,MessageBoxIcon.Error);
//if (dr == DialogResult.OK)
{

File.Delete(fileName);//删除原来的文件,重新写入
}
}

MSExcel.Application excelApp;
MSExcel.Workbook excelDoc;
excelApp = new MSExcel.ApplicationClass();
Object Nothing = Missing.Value;
excelDoc = excelApp.Workbooks.Add(Nothing);
MSExcel.Worksheet ws = (MSExcel.Worksheet)excelDoc.Sheets[1];
int i = 3;//从第3行开始写入,即A3
foreach (Basis oneL in singers.Values)
{
ws.Cells[i, 1] = oneL.Stunumber;
ws.Columns.AutoFit();//自动调整宽度
ws.Cells[i, 2] = oneL.Stuname;
ws.Columns.AutoFit();
ws.Cells[i, 3] = oneL.Idcard;
ws.Columns.AutoFit();
ws.Cells[i, 4] = oneL.Sex;
ws.Columns.AutoFit();
ws.Cells[i, 5] = oneL.Birthrate;
ws.Columns.AutoFit();
ws.Cells[i, 6] = oneL.Nation;
ws.Columns.AutoFit();
ws.Cells[i, 7] = oneL.Handsetnumber;
ws.Columns.AutoFit();
ws.Cells[i, 8] = oneL.QQ;
ws.Columns.AutoFit();
ws.Cells[i, 9] = oneL.Bedchamber;
ws.Columns.AutoFit();
ws.Cells[i, 10] = oneL.Houseaddress;
ws.Columns.AutoFit();
ws.Cells[i, 11] = i.ToString();
i++;//行数增加
}

//保存写入excel里的数据
excelDoc.SaveAs(fileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
excelDoc.Close(Nothing, Nothing, Nothing);
//关闭excelApp组件对象
excelApp.Quit();
MessageBox.Show("保存成功");
}
__天涯寻梦 2012-06-13
  • 打赏
  • 举报
回复
liquidation();//清空
这清空什么了,不会是 singers 吧?
qldsrx 2012-06-13
  • 打赏
  • 举报
回复
singers.Add(singer.Stunumber,singer);//把每条记录加载到 singers

这里我没有看到循环,仅添加了一个singer元素,你怎么说是每条记录?哪来的那么多条啊
IT-学徒 2012-06-13
  • 打赏
  • 举报
回复
保存时,只能保存最后一条记录
IT-学徒 2012-06-13
  • 打赏
  • 举报
回复
通过新添将输入信息在ListView中显示,全部录入完成后,点击保存按钮
将lISTvIEW中的数据存入Excel文件
IT-学徒 2012-06-13
  • 打赏
  • 举报
回复
mathieuxiao 2012-06-13
  • 打赏
  • 举报
回复

//你在foreach里面使用i++感觉好别扭
for (int j = 0 ; j < singers.Values.Count(), j++)
{
Basis oneL = singers.Values[i];
int i = j + 3;
//遍历dictionary
ws.Cells[i, 1] = oneL.Stunumber;
ws.Columns.AutoFit();//自动调整宽度
ws.Cells[i, 2] = oneL.Stuname;
ws.Columns.AutoFit();
ws.Cells[i, 3] = oneL.Idcard;
ws.Columns.AutoFit();
ws.Cells[i, 4] = oneL.Sex;
ws.Columns.AutoFit();
ws.Cells[i, 5] = oneL.Birthrate;
ws.Columns.AutoFit();
ws.Cells[i, 6] = oneL.Nation;
ws.Columns.AutoFit();
ws.Cells[i, 7] = oneL.Handsetnumber;
ws.Columns.AutoFit();
ws.Cells[i, 8] = oneL.QQ;
ws.Columns.AutoFit();
ws.Cells[i, 9] = oneL.Bedchamber;
ws.Columns.AutoFit();
ws.Cells[i, 10] = oneL.Houseaddress;
ws.Columns.AutoFit();
ws.Cells[i, 11] = i.ToString();
i++;//行数增加
}

EnForGrass 2012-06-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

有几条记录,但是只能找到最后一条,然后在excel里,条一样的
[/Quote]
为什么只能找到最后一条?估计Basis就只有在singers.Values里取到一条,你看看Basis?
IT-学徒 2012-06-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
Basis 是什么类型?dictionary应该是KeyValuePair类型的,
[/Quote]
Basis 是自定义类
IT-学徒 2012-06-13
  • 打赏
  • 举报
回复
有几条记录,但是只能找到最后一条,然后在excel里,条一样的
stonespace 2012-06-13
  • 打赏
  • 举报
回复
Basis 是什么类型?dictionary应该是KeyValuePair类型的,
bdmh 2012-06-13
  • 打赏
  • 举报
回复
估计singers.Values就一条记录
EnForGrass 2012-06-13
  • 打赏
  • 举报
回复
看看singers.Values有几条数据??

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧