1,我在程序中有一些数据要保存(不保存在数据库或本地文件),格式就像数据表一样一行有很多列。
比如  张三   26岁   男    汉  .......
请问我用什么方式把这些数据保存在内存供后面的程序调用了?
arraylist只有一列。数组大小又是固定的。
2,我有个listbox1,里面有很多元素,
比如listbox1.add("张三");
listbox1.add("李四")
我在listbox1的点击事件里
添加了 Form2 form2=new Form2();
form2是个显示个人信息的窗口。
这样一来每点击一个元素就会创建一个form2.
我的意思是
1.点击张三创建了个form2,再次点击张三的话应该判断是否已经有张三这个Form2; 怎么判断?
2.程序收到别的消息要求更改张三那个FORM2上的控件信息。   用什么代码才能访问张三创建的form2;
我觉得是不是不应该用Form2 form2=new Form2()来创建 form2有多个实例,真不知道怎么区分。
大虾们解决我这两个问题。我分都送了。

解决方案 »

  1.   

    1.你可以保存在xml对象中,然后与DataSet绑定。
    你可以在xml中设置你的这些结点2.你可以把窗口名以及form保存在哈希表中,然后下次先将窗口名与哈希表中窗口名比较,如果有的话就将相应的form取出来
      

  2.   

    xml可以模拟数据库的结构。与DataSet绑定后就可以很方便的操作了。
      

  3.   

    1 :  datatable2 :  
    if(form2 == null ) 
             Form2 form2=new Form2(); 
         else
             form2.show();
         end if;
      

  4.   

    xml是个很好的东西,建议楼主多看看这方面的!!
      

  5.   


    //先给出第一个问题的,第二个稍后.
    DataTable dtInfo = new DataTable();
    DataColumn dcName = new DataColumn("姓名");
    DataColumn dcAge = new DataColumn("年龄");
    DataColumn dcSex = new DataColumn("性别");
    DataColumn dcNation = new DataColumn("民族");
    //可以再接着加
    dtInfo.Columns.Add(dcName);
    dtInfo.Columns.Add(dcAge);
    dtInfo.Columns.Add(dcSex);
    dtInfo.Columns.Add(dcNation);
    //可以再接着加
    dtInfo.Rows.Add("张三", "26岁", "男", "汉");
    //dataGridView1.DataSource = dtInfo.DefaultView;
    //用这个可以看到结果.眼见到才算真的^-^
      

  6.   

    1 用DataTable,由于可以正确对应行和列
    2 用ArrayList等集合,每行内将各元素用分号(或其它符号隔开)
    3 用ArrayList等集合,元素为类文件,类的属性为存放的信息的列内容
    4 从3来,可用哈希表,Key为唯一信息(如员工编号,或姓名(如果可以的话)),Value亦为类文件(同3)
      

  7.   


    //第二个问题的
    Form from2;
    private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (from2 == null)
        {
            from2 = new Form();                
            from2.Show();
            from2.Text = listBox1.SelectedItem.ToString();    }
        else
        {
            from2.Show();
            from2.Text = listBox1.SelectedItem.ToString();    }
    }
      

  8.   


    if (from2 == null)
    {
        from2 = new Form();                
        from2.Show();
        from2.Text = listBox1.SelectedItem.ToString();
        //如果from2中有一用到存放姓名的TextBox控件txtName,把它设为公开 public
        //from2.txtName.Text = "张三"}
    else
    {
        from2.Show();
        from2.Text = listBox1.SelectedItem.ToString();}
      

  9.   

    1 :  datatable 2 :    Form2 form2=null
      if(form2==null)
    {
        form2=new Form2();
        form2.show();
    }
      else
        form2.show();
      

  10.   

    第一个问题:
      1:DataTable
      2:List<对象>      泛型第二个问题:
      if(Application.OpenForms["form2"]!=null)
      {
        Form2 form2 = new Form2();
        form2.Show();
      }
      

  11.   

    给一个新思路,关于第一个问题
    可以建立一个结构体,存入arraylist中调用
    如果用到查询 则放入哈希表中,key是名称,value是结构体
      

  12.   

    不过 还是Datatable的形式 比较好,  查询 比结构体 方便多了 
      

  13.   

    我通常都是采用这种方式的,xml也可以
      

  14.   

                System.Collections.Hashtable ht = new System.Collections.Hashtable() ;
                ht.Add("张三", "26岁,男,汉 ");
                MessageBox.Show((string )ht["张三"] );      
      

  15.   

    datatable 或者 DATAREADER保存在内存中
      

  16.   

    1 DataTable
    2 Singleton
      

  17.   

    多谢各位的回答:
    还是有些问题请大家看看
    1.上面说了几个方法
    这个方法可能更适合我一些。
    DataTable dtInfo = new DataTable();
    DataColumn dcName = new DataColumn("姓名");
    DataColumn dcAge = new DataColumn("年龄");
    DataColumn dcSex = new DataColumn("性别");
    DataColumn dcNation = new DataColumn("民族");
    //可以再接着加
    dtInfo.Columns.Add(dcName);
    dtInfo.Columns.Add(dcAge);
    dtInfo.Columns.Add(dcSex);
    dtInfo.Columns.Add(dcNation);
    //可以再接着加
    dtInfo.Rows.Add("张三", "26岁", "男", "汉");
    添加了是否可以用SQL语句查询,或者用别的方式查询。因为可能要更改其中某一列的值.2.关于第二个问题
    大家好像没明白我的意思比如listbox1.add("张三"); 
    listbox1.add("李四") 
    我在listbox1的点击事件里 
    添加了 Form2 form2=new Form2(); 当我点击张三创建了张三信息的Form2并显示出来。
    当我点击了李四又创建了李四的form2并显示出来。
    如果用这个方法
    private void listBox1_SelectedIndexChanged(object sender, EventArgs e) 

        if (from2 == null) 
        { 
            from2 = new Form();                
            from2.Show(); 
            from2.Text = listBox1.SelectedItem.ToString();     } 
        else 
        { 
            from2.Show(); 
            from2.Text = listBox1.SelectedItem.ToString();     } 

    当我关闭了张三的form2(李四的form2还没关闭).我再点击张三的话。张三信息的FORM2还会出来吗?
    这个问题我开始用的是句柄。每创建一个form2,就把窗口句柄与姓名联系起来保存在数组中
    关闭窗体的时候再从数组中删除。。我感觉比较麻烦。
    最重要的问题是。当张三和李四的FORM2都开着。
    程序收到别的消息要求更改张三FORM2上的控件TEXTBOX的内容,请问应该怎么做?
    我这时如果用form2.textBox1.text="  ";
    这句代码更改张三的form2还是更改的李四的form2上的textbox的内容?
    我想是不是在创建窗体的时候用 Form2 变量=new Form2(),这样能行的话所有的问题都可以解决了。
    这样点击listbox的时候就可以先看看这个窗体是不是NULL。收到消息后就直接可以用 变量.textbox.text=""
    就是不知道应该怎么使这句话 Form2 变量=new Form2()能用?
    或者还有什么好的思路麻烦大家告诉我,最好给我代码。好吗?
    再次谢谢大家
      

  18.   

    怎么没人提供XML的代码,我还等着学习呢
      

  19.   

    存到哈西表里不错至于判断窗体是否被打开可以这样做,创建一个数组,这个数组存放当前listBox中的items的状态,也就是说 如果点了“张三”
    那么"张三"对应的   数组引用张三的INDEX   i[张三的INDEX]=1;   当张三的窗体关闭时,再将 i[张三的INDEX]=0;
    这样,  在CLICK事件中先判断对应INDEX数组中的值  就能确定此人的信息是否已经被显示
      

  20.   

    要把数据放到内存里啊
    干嘛不用DataView啊
      

  21.   

    arraylist只有一列。数组大小又是固定的。 那为什么不用list<T>呢
      

  22.   

    第二个问题还没解决了。大家给我说说好吗
    2.关于第二个问题 
    比如listbox1.add("张三"); 
    listbox1.add("李四") 
    我在listbox1的点击事件里 
    添加了 Form2 form2=new Form2(); 当我点击张三创建了张三信息的Form2并显示出来。 
    当我点击了李四又创建了李四的form2并显示出来。 
    如果用这个方法 
    private void listBox1_SelectedIndexChanged(object sender, EventArgs e) 

        if (from2 == null) 
        { 
            from2 = new Form();                
            from2.Show(); 
            from2.Text = listBox1.SelectedItem.ToString();     } 
        else 
        { 
            from2.Show(); 
            from2.Text = listBox1.SelectedItem.ToString();     } 

    当我关闭了张三的form2(李四的form2还没关闭).我再点击张三的话。张三信息的FORM2还会出来吗? 
    这个问题我开始用的是句柄。每创建一个form2,就把窗口句柄与姓名联系起来保存在数组中 
    关闭窗体的时候再从数组中删除。。我感觉比较麻烦。 
    最重要的问题是。当张三和李四的FORM2都开着。 
    程序收到别的消息要求更改张三FORM2上的控件TEXTBOX的内容,请问应该怎么做? 
    我这时如果用form2.textBox1.text="  "; 
    这句代码更改张三的form2还是更改的李四的form2上的textbox的内容? 
    我想是不是在创建窗体的时候用 Form2 变量=new Form2(),这样能行的话所有的问题都可以解决了。 
    这样点击listbox的时候就可以先看看这个窗体是不是NULL。收到消息后就直接可以用 变量.textbox.text="" 
    就是不知道应该怎么使这句话 Form2 变量=new Form2()能用? 
    或者还有什么好的思路麻烦大家告诉我,最好给我代码。好吗? 
    再次谢谢大家 
      

  23.   


                bool hasForm=false;
                foreach (Form fm in Application.OpenForms)
                {
                    if (fm.Text == listBox1.SelectedItem.ToString())
                    {
                        hasForm = true;
                        fm.BackColor = Color.Blue; //我实验是改背景颜色,fm找到了,你可以随便做些啥。。
                        break;
                    }                else
                    {
                        hasForm = false;
                    }
                }
                if (!hasForm)
                {
                    Form2 form2 = new Form2();
                    form2.Text = listBox1.SelectedItem.ToString();
                    form2.Show();
                }
      

  24.   

    上面的代码写在listBoxselectedIndexChanged事件处理方法里。
    刚才忘了说明了。
      

  25.   

    用XMLDocument...
    XmlDocument xd=new XmlDocument();
    xd.Load("c:\\library.xml");XmlElement root=xd.CreateElement("root");
    xd.Document=root;XmlElement name=xd.CreateElement("name");
    XmlAttribute age=xd.Create("age");name.Attributes.Add(age);
    root.AppentChield(name);...
      

  26.   

    1.可以使用泛型类的集合List<T>
    2.你可以先声明一个Form form2,
      点击时在事件的代码中实例它form2 = new Form("张三");
      再次点击是判断是否为空
      if(form2 == null)
      {
         form2 = new Form();
      }
      else
      {
         ....这里可以修改已经“张三”的信息或者别的操作
      }
      

  27.   

    臨時數據保存用datatable,要多少列就建多少列,不過不明白lz這樣做有什麼意義,數據不保存程序關了以後再手動輸數據嗎
      

  28.   


    asp.net 高级编辑看:列表与集合
      

  29.   

    sorry asp.net 高级编程看:列表与集合