none
新手请教combobox动态绑定多字段数据的问题 RRS feed

  • 问题

  • 小弟想帮单位搞一个简单的应用小程序,用c#做,现在遇到点难题,问题如下:在程序的应用窗体上放置了两个combobox,combobox1和combbox2,另外还有label1、label2、label3三个标签,一个btn1按钮,现在想要把一个csv格式文件里的数据绑定到combobox1和combobox2里面,csv文件里面如下所示(我复制了几条数据,实际有1010条):

    Entry,入口站,EXIT,出口站,总里程,路段1,路段2,路段3,路段4
    S0770,收费站1,S0770,收费站1,16.196,16.196,0,0,0
    S0770,收费站1,S0771,收费站2,17.008,17.008,0,0,0
    S0771,收费站2,S0770,收费站1,17.008,17.008,0,0,0
    S0771,收费站2,S0771,收费站2,19.82,19.82,0,0,0
    S1280,收费站3,S0770,收费站1,141.479,56.308,73.083,12.088,0
    S1280,收费站3,S0771,收费站2,125.471,40.3,73.083,12.088,0
    S1281,收费站4,S0770,收费站1,160.501,56.308,73.083,31.11,0
    S1281,收费站4,S0771,收费站2,144.493,40.3,73.083,31.11,0
    S4574,收费站5,S0770,收费站1,57.618,56.308,1.31,0,0
    S4574,收费站5,S0771,收费站2,41.61,40.3,1.31,0,0
    S4575,收费站6,S0770,收费站1,71.026,56.308,14.718,0,0
    S4575,收费站6,S0771,收费站2,55.018,40.3,14.718,0,0
    S5501,收费站7,S0772,收费站1,120.98,22.228,73.083,9.495,16.174
    S5501,收费站7,S0773,收费站2,105.785,7.033,73.083,9.495,16.174
    S5502,收费站8,S0770,收费站1,183.858,56.308,73.083,9.495,44.972
    S5502,收费站8,S0771,收费站2,167.85,40.3,73.083,9.495,44.972

    收费站1、收费站2属于路段1,收费站3、收费站4属于路段2,收费站5、收费站6属于路段3,收费站7、收费站8属于路段4,其中combobox1显示内容为绑定的“Entry”+“入口站”两列数据(内容不重复),combobox2显示内容为绑定的“exit”+“出口站”两列数据(内容不重复),当combobox1任选一项,combobox2任选一项后,点击btn1按钮,lable1显示的内容为两项对应的“总里程”这列的值,label2为选择的combobox1项对应的“路段1”这列的值+“路段2”这列的值+“路段3”这列的值,lable3为选择的combobox1项对应的“路段4”这列的值。

    如果这个程序用数据库的方式绑定可能好办,但我不想用数据库,只想用写一个小程序就像绿色软件一样,就一个exe文件,方便使用,搞了半天不知道如何写。特来求助大家。
    我基本思路是这样,先在主窗体FrmMain_Load里面先自定义一个数据源,然后取出各列的值,然后赋值给各lable:
      private void FrmMain_Load(object sender, EventArgs e)
      {
      //自定义数据表
      DataTable list = new DataTable();
      list.Columns.Add(new DataColumn("eName", typeof(string)));
      list.Columns.Add(new DataColumn("xName", typeof(string)));
      list.Columns.Add(new DataColumn("allMil", typeof(float)));
      list.Columns.Add(new DataColumn("Mil01", typeof(float)));
      list.Columns.Add(new DataColumn("Mil02", typeof(float)));
      list.Columns.Add(new DataColumn("Mil03", typeof(float)));
      list.Columns.Add(new DataColumn("Mil04", typeof(float)));
      list.Rows.Add(list.NewRow());
      list.Rows.Add(list.NewRow());
      list.Rows.Add(list.NewRow());
      list.Rows.Add(list.NewRow());
      list.Rows.Add(list.NewRow());
      list.Rows.Add(list.NewRow());
      list.Rows.Add(list.NewRow());
      list.Rows.Add(list.NewRow());
      list.Rows.Add(list.NewRow());
      list.Rows.Add(list.NewRow());
      list.Rows.Add(list.NewRow());
      list.Rows.Add(list.NewRow());
      list.Rows.Add(list.NewRow());
      list.Rows.Add(list.NewRow());
      list.Rows.Add(list.NewRow());
      list.Rows.Add(list.NewRow());
      list.Rows.Add(list.NewRow());
      list.Rows.Add(list.NewRow());
      list.Rows.Add(list.NewRow());
      list.Rows.Add(list.NewRow());
      list.Rows.Add(list.NewRow());
      list.Rows.Add(list.NewRow());
      list.Rows.Add(list.NewRow());
      list.Rows.Add(list.NewRow());
      list.Rows[0][0] = "收费站1";
      list.Rows[0][1] = "收费站2";
      list.Rows[0][2] = 13.592;
      list.Rows[0][3] = 13.592;
      list.Rows[0][4] = 0;
      list.Rows[0][5] = 0;
      list.Rows[0][6] = 0;
      list.Rows[1][0] = "收费站1";
      list.Rows[1][1] = "收费站3";
      list.Rows[1][2] = 29.6;
      list.Rows[1][3] = 29.6;
      list.Rows[1][4] = 0;
      list.Rows[1][5] = 0;
      list.Rows[1][6] = 0;
      list.Rows[2][0] = "收费站1";
      list.Rows[2][1] = "收费站4";
      list.Rows[2][2] = 47.672;
      list.Rows[2][3] = 47.672;
      list.Rows[2][4] = 0;
      list.Rows[2][5] = 0;
      list.Rows[2][6] = 0;
      //定义收费站的列表框内容,且筛选重复
      List<String> iseName = new List<string>();
      List<String> isxName = new List<string>();
      for(int i=0;i< list.Rows.Count;i++)
      {
      string ename = list.Rows[i][0].ToString();  
      string xname = list.Rows[i][1].ToString();  
      if (iseName.Contains(ename) || isxName.Contains(xname))
      {
      continue;
      }
      else
      {
      iseName.Add(ename);
      isxName.Add(xname);
      }
      }
      comboBox1.DataSource = iseName;
      comboBox1.DisplayMember = "eName";
      comboBox2.DataSource = isxName;
      comboBox2.DisplayMember = "xName";
      }
    我这样通过主窗体预先加载的方式添加1000条左右的数据,不知道效率如何,这个程序运行占内存是不是很大,如何优化,另外三个lable赋值的问题,不知道怎么取值赋值,特求助大家。万分感激,我才开始学c#,想请教下各前辈,学习学习。
    2012年9月3日 15:01

全部回复

  • 另外,我在写程序前,对这个文件内容列合并了下,把Entry,入口站这两列和EXIT,出口站这两列手工合并了,写程序时候方便些。
    2012年9月3日 15:08
  • 1000 数据很少的。不会占用多少内存,不过.NET开发的程序几十兆内存还是要吃的。

    label有text属性,你可以绑定或者直接读取或者赋值。


    family as water

    2012年9月4日 1:09
  • 1000 数据很少的。不会占用多少内存,不过.NET开发的程序几十兆内存还是要吃的。

    label有text属性,你可以绑定或者直接读取或者赋值。


    family as water

    感谢你的回答

    我现在是不准备采用读取csv文件的方式,想自己按照csv的内容,自建一个数据源,然后绑定,筛选,我上面附的那段代码已经能实现combobox显示内容的筛选了,现在就是问题是如何在选择了combobox1和combobox2的项后,点击按钮,根据combobox1的项和combobox2的项判断各项的值,比如combobox1的项目选择了入口站代码是开头为0或1或4的以及combobox2的项目选择了出口站代码是开头为0或1或4的,lalbe2显示的是路段1列+路段2列+路段3列的值,lalbe3显示的是路段4列的值


    2012年9月4日 2:04
  • 现在关键问题是如何在选择了combobox1和combobox2的项后,点击按钮,根据combobox1的项和combobox2的项判断各项的值,比如截取combobox1项的内容开头为0或1或4的以及combobox2项的内容为开头为0或1或4的,lalbe2显示的是路段1列+路段2列+路段3列的值,lalbe3显示的是路段4列的值。这个地方代码如何写,没头绪:(
    2012年9月4日 2:47