【问题标题】:Select Data from combo box and shows the information to it in List Box c#从组合框中选择数据并在列表框中显示信息 c#
【发布时间】:2012-08-08 14:29:51
【问题描述】:

我遇到了一些问题,当用户在组合框中选择所选名称时,与所选名称链接的数据将显示在列表框中。我在使用这种方法时遇到问题。错误就在这里。

int selectLocStation = Convert.ToInt32(cbLocStation.SelectedValue);

错误:无法将类型为“f_AnonymousType2'2 [System.String.System.Int32]”的对象转换为类型“System.IConvertible”。

private void cbLocStation_SelectedIndexChanged(object sender, EventArgs e)
    {
        using (satsEntities Setupctx = new satsEntities())
        {
            int selectLocStation = Convert.ToInt32(cbLocStation.SelectedValue);

            var query = (from db in Setupctx.requiredtimings
                         join timing t in Setupctx.timings on db.RequiredTimingID equals t.TimingID
                         where db.RequiredLocationStationID == selectLocStation
                         select new
                         {
                             t.Time2
                         }).ToList();

            List<TimeSpan> lstSelectedTime = new List<TimeSpan>();

            foreach (var a in query)
            {
                lstSelectedTime.Add((TimeSpan)a.Time2);
            }

            lstTime.DataSource = lstSelectedTime;
        }
    }

这就是我在组合框中存储数据的方法。

using (satsEntities Setupctx = new satsEntities())
        {
            var DeleteRT = (from DelRT in Setupctx.requiredtimings
                            join locationstationname ls in Setupctx.locationstationnames on DelRT.RequiredLocationStationID equals ls.locationstationID
                            select new { ls.locStatname, DelRT.RequiredLocationStationID }).Distinct().ToList();

            cbLocStation.DataSource = DeleteRT.ToList();
            cbLocStation.DisplayMember = "locStatname";
            cbLocStation.ValueMember = "RequiredLocationStationID";

任何帮助将不胜感激。

【问题讨论】:

  • 如何初始化组合框?您能告诉我们您的组合框包含哪些值吗?
  • 让我向您展示我在组合框中存储数据的代码。

标签: c# linq combobox listbox


【解决方案1】:
  private void Edit_TS_Load(object sender, EventArgs e)
    {
        using (satsEntities Setupctx = new satsEntities())
        {
            var DeleteRT = (from DelRT in Setupctx.requiredtimings
                           join locationstationname ls in Setupctx.locationstationnames on DelRT.RequiredLocationStationID equals ls.locationstationID
                           select new {ls.locStatname, DelRT.RequiredLocationStationID}).Distinct().ToList();

            cbLocStation.DataSource = DeleteRT.ToList();
            cbLocStation.DisplayMember = "locStatname";
            cbLocStation.ValueMember = "RequiredLocationStationID";

        }
    }

答案就在这里!

【讨论】:

    【解决方案2】:

    您正在尝试将查询中的匿名类型转换为时间跨度,这是不可能的,因为它没有实现 IConvertible。您可以编写一个包装类并在查询中选择该类。

    var query = (from db in Setupctx.requiredtimings
                             join timing t in Setupctx.timings on db.RequiredTimingID equals t.TimingID
                             where db.RequiredLocationStationID == selectLocStation
                             select new WrapperClass
                             {
                                 Time = t.Time2
                             }).ToList();
    
    public class WrapperClass
            {
                public DateTime Time { get; set; }
            }
    

    其中 time 是您在包装类中定义的 DateTime

    【讨论】:

    • 写一个 WrapperClass 是什么意思?介意展示一些例子吗?谢谢!
    • select new 返回一种匿名类型,您无法对其执行操作,例如您尝试完成的类型。相反,根据您的需要,您应该编写一个从查询返回的类。然后你就可以使用输出了。
    • 我无法使用 DateTime,因为我正在使用 TimeSpan,如果我将 DateTime 更改为 TimeSpan 仍然提示错误。
    【解决方案3】:

    如果字符串可用,我会试试这个

    int selectLocStation = Convert.ToInt32(cbLocStation.SelectedValue.ToString());
    

    或者这个

    int selectLocStation =Int32.Parse(cbLocStation.SelectedValue.ToString());
    

    你也可以试试这个

    DataRowView drow = (DataRowView)cbLocStation.SelectedItem;
    string str = drow.Row.ItemArray[0].ToString();
    

    检查字符串是否有数字并将其转换为 int

    你也可以添加数据绑定

    BindingContext oBC = new BindingContext();
        cbLocStation.BindingContext = oBC;
        cbLocStation.DataBindings.Add(new Binding("SelectedValue", DeleteRT, "RequiredLocationStationID", false, DataSourceUpdateMode.OnPropertyChanged));
    

    【讨论】:

    • 我试过你的方法,他们提示我另一个错误,说“输入字符串的格式不正确”。
    • @rookie ohhh 尝试检查字符串是否真的包含数字,否则使用 int parse
    • 我正在使用 Windows 窗体应用程序。
    • @rookie 我认为问题在于您使用的是数据绑定
    • 您的意思是我用来绑定组合中数据的DataSource 对吧?我尝试使用 Items.Add 使用其他方式,但 selectedValue 与我的数据库不同,因此无法在 Selected 名称下显示任何数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多