我的作业开始于在listBox中显示100个随机数。这很好用。接下来,我们使用StreamWriter& StreamReader将结果写入并读回第二个listBox。在这里,有几件事正在发生。 100行中的每一行都以...为前缀 System.Windows.Forms.ListBox.Items.Count 。
如果您尝试谷歌这样的短语,MSDN库labrynth就是所有显示的,我发现没有什么适用于此。我被提到http://www.dotnetperls.com/listbox,但也找不到解决办法。此外,回读的100个条目中的每一个只是第一个随机,而不是全部100.我知道这是一个单独的问题。这是我需要先修复的__System.Windows.Forms ..部分。
我今天取消了工作,专注于此。时间飞逝,我无处可去。我已经解剖了我的教科书,谷歌疯了,在FaceBook上发现了一个.NET用户组,也没有任何帮助。 ..我不知道还能去哪里。
到目前为止我的代码如下......
/* Matthew A. May June 17th. & 22nd POS/409
* This application simulates the roll of dice 100 times. The output is displayed in
* the listBox. The Results can be saved (written) to a text file. This txtFile can
* then be read back and redisplayed. ** Some code is derived from...
* Gaddis, T. (2012). Starting out with Visual C#® 2010 (2nd ed.). Boston, MA: Addison-Wesley.....
* Page #s' are referenced accordingly throughout where applicable. *
* */
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO; //required for the StreamWrite & StreamReader classes for txtFile functions.
namespace WindowsFormsApplication1
{
public partial class Main : Form
{
private int diceSide1; // private accessor
private int diceSide2; // Field Variable Declarations.
private int SUM; // SUM = diceSide1 + diceSide2
const int Roll_MAX = 100;
public Main()
{
InitializeComponent();
}
private void groupBox2_Enter(object sender, EventArgs e)
{
//GroupBox...
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void btnWrite_Click(object sender, EventArgs e)
{
/* When the user clicks a Write button, the program will write the sum of the dice for each roll into a sequential data file.
the SUM is an int= dye1 + dye 2. SUM cannot be a constant since its' value wil change with each roll.
*/
}
private void btnRollEm(object sender, EventArgs e)
{
Random rand = new Random(); //creates new object from Random Class. Gaddis, T. (2012)Chptr5Pg321.
for (int lineNum = 1; lineNum <= Roll_MAX; lineNum++)
{
diceSide1 = rand.Next(6) + 1;
diceSide2 = rand.Next(6) + 1;
SUM = diceSide1 + diceSide2;
lstBoxOut.Items.Add ("On roll , " + lineNum + " ,You rolled a " + diceSide1 + " and a " + diceSide2 + " for a sum of " + SUM);
} //end For-Loop. At this point, output is exactly as expected.
} //End btnRollEm
private void btnWriteToFile(object sender, EventArgs e)
{
StreamWriter rollLog; //create StreamWriter object reference Variable.
rollLog = File.CreateText("Roll Results.txt"); //creating the File.
for (int count = 1; count <= 100; count++)
{
rollLog.WriteLine(lstBoxOut);
//changing (lstBoxOut) to (count) shows 1-100 vertically.
//Example Pg.298 & 301, showing where to write to.
} //End Write ForLoop
rollLog.Close(); //close file after creation.
MessageBox.Show ("Your results have been successfully Saved to File.");
} //reviewing the txtFile, only the 1st line is written 100 times.
private void btnReadFile(object sender, EventArgs e)
{
//btnRead From File. Hides Main Form, Shows 2nd Form for txtFile OutPut.
Form2 form2 = new Form2();
form2.Show(); //Show // StreamReader. Read txt File.
//// Declare a StreamReader variable.
//StreamReader rollResults;
//// Open the file and get a StreamReader object.
//rollResults = File.OpenText("Roll Results.txt");
}
private void lstBoxOut_SelectedIndexChanged_1(object sender, EventArgs e)
{
}
private void btnClear(object sender, EventArgs e)
{
lstBoxOut.Items.Clear(); //doesn't work.
}
private void btnExit(object sender, EventArgs e)
{
this.Close(); // Close the form.
}
} //End Class Declaration
} //End NameSpace Declaration
答案 0 :(得分:2)
要编写项目,请将写入的行更改为:
rollLog.WriteLine(lstBoxOut.items[count]);
请阅读:
private void btnReadFile(object sender, EventArgs e)
{
lstBoxOut.Items.Clear();
foreach (string line in File.ReadLines("Roll Results.txt"))
{
lstBoxOut.Items.Add(line);
}
}
您获得该输出"System.Windows.Forms.ListBox...."
的原因是因为语句rollLog.WriteLine(lstBoxOut)
等同于rollLog.WriteLine(lstBoxOut.ToString())
。 ToString() method返回
如果计数不为0,则表示控件类型,ListBox控件中的项数以及ListBox中第一个项的Text属性的字符串。
答案 1 :(得分:1)
列表框中的每个项目都包含在Items集合中。在编写这些项目时,您应该遍历items集合,读取字符串并将其写入磁盘
using(StreamWriter rollLog = new StreamWriter("Roll Results.txt"))
{
for (int count = 0; count < lstBoxOut.Items.Count; count++)
{
rollLog.WriteLine(lstBoxOut.Items[count].ToString());
}
}
另请注意,循环从索引0开始,到Items.Count - 1结束,因为在.NET中,数组基于零。 using语句也非常有用,因为如果出现错误(例外),它可以确保正确关闭文件
阅读操作类似
using(StreamReader rollLog = new StreamReader("Roll Results.txt"))
{
while (rollLog.Peek() >= 0)
{
lstBoxOut.Items.Add(rollLog.ReadLine());
}
}
答案 2 :(得分:0)
请按照以下
修改您的代码 private void btnWriteToFile(object sender, EventArgs e)
{
StreamWriter rollLog; //create StreamWriter object reference Variable.
rollLog = File.CreateText("Roll Results.txt"); //creating the File.
for (int count = 0; count <lstBoxOut.Items.Count; count++)
{
rollLog.WriteLine(Convert.ToString(lstBoxOut.Items[count]));
//changing (lstBoxOut) to (count) shows 1-100 vertically.
//Example Pg.298 & 301, showing where to write to.
} //End Write ForLoop
rollLog.Close(); //close file after creation.
MessageBox.Show ("Your results have been successfully Saved to File.");
} //reviewing the txtFile, only the 1st line is written 100 times.
答案 3 :(得分:0)
for (int count = 1; count <= 100; count++)
{
rollLog.WriteLine(lstBoxOut);
}
这可能是您问题的根源。对于循环的每次迭代,您都在向文件写入相同的内容(因此100条相同的行)。顺便说一下,看到这个的一个很大的线索是大多数的时间(并非总是)当你有一个循环变量(在这种情况下为'count')时你应该使用该变量你某个地方的身体。
接下来,奇怪的“System.Windows.Forms.ListBox.Items.Count”数据。发生这种情况的原因是您正在写入该文件的。你正在编写“lstBoxOut”,这是列表框本身,而不是内容。默认情况下,大多数WPF类型只会在执行此操作时转换为该类型的名称。你可能想写的东西是这样的:
for (int count = 1; count <= 100; count++)
{
rollLog.WriteLine(lstBoxOut.Items[count]);
}
答案 4 :(得分:0)
在“写入文件”方法中,指定以下内容:
rollLog.WriteLine(lstBoxOut);
我将假设lstBoxOut是一个ListBox项,因为之前有一些代码,特别是:
lstBoxOut.Items.Add ("On roll , " + lineNum + " ,You rolled a " + diceSide1 + " and a " + diceSide2 + " for a sum of " + SUM);
话虽如此,那不是你从列表框中获取项目的方式。考虑使用
lstBoxOut.Items[count].ToString()
在WriteLine命令中,或者为了更好的做法,使用foreach循环而不是for循环。