ListBox显示“System.Windows.Forms.ListBox.Items.Count ...”

时间:2013-06-24 20:20:50

标签: c# winforms

我的作业开始于在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

5 个答案:

答案 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);

我将假设l​​stBoxOut是一个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循环。