ComboBox选择的值不起作用

时间:2018-04-02 20:02:43

标签: c# sql

我的代码出现问题,基本上我想要一个能够显示团队的组合框,当一个团队被选中时,它会在列表框中显示连接到该团队的玩家。问题是我有很多错误

以下是用团队填充组合框的代码

   String sqlTeam = @"select * from Team";
        daTeam = new SqlDataAdapter(sqlTeam, connStr);
        SqlCommandBuilder cmdBTeam = new SqlCommandBuilder(daTeam);
        daTeam.FillSchema(dsCIF, SchemaType.Source, "Team");
        DataTable dtTeam = new DataTable();
        daTeam.Fill(dsCIF, "Team");
        daTeam.Fill(dtTeam);

        cmbTeam1.DataSource = dtTeam;
        cmbTeam1.ValueMember = "TeamID";
        cmbTeam1.DisplayMember = "TeamName";

        cmbTeam2.DataSource = dtTeam;
        cmbTeam2.ValueMember = "TeamID";
        cmbTeam2.DisplayMember = "TeamName";

当在组合框中更改团队时,它将使用连接到该团队的玩家重新填充列表框,这里是列表框的代码

  sqlPlayers3 = @" Select PlayerID, PlayerForename, PlayerSurname, PlayerAge, PlayerStatus, (Playerforename +' '+Playersurname) as FullName from Player where TeamID  = @cmb";
        SqlCommand cmd = new SqlCommand();
        cmd.Parameters.AddWithValue("@cmb", int.Parse(cmbTeam1.SelectedValue.ToString()));

        String connStr5 = Properties.Resources.cString;
        SqlDataAdapter daPlayer4 = new SqlDataAdapter(sqlPlayers3, Properties.Resources.cString);
        DataTable dtPlayers3 = new DataTable();
        daPlayer4.Fill(dtPlayers3);

        lbTeam1Goal1.DataSource = dtPlayers3;
        lbTeam1Goal1.ValueMember = "PlayerID";
        lbTeam1Goal1.DisplayMember = "FullName";


        lbTeam1Bookings1.DataSource = dtPlayers3;
        lbTeam1Bookings1.ValueMember = "PlayerID";
        lbTeam1Bookings1.DisplayMember = "FullName";

问题是,当我加载表单时,我不断收到此错误,突出显示这行代码

cmd.Parameters.AddWithValue("@cmb", int.Parse(cmbTeam1.SelectedValue.ToString()));


System.FormatException: 'Input string was not in correct format.'

我已经采用了许多不同的方法,但代码似乎不起作用。我正在使用SQL数据库,它连接到visual studio c#。我有什么遗漏或做错了吗?

1 个答案:

答案 0 :(得分:1)

您的计划中有两个问题

您看到'Input string was not in correct format.'的错误是由于ComboBox.SelectedIndexChanged()事件处理程序在绑定数据后立即触发。在定义ValueMemberDisplayMember之前,您正在绑定数据。这意味着您的SelectedValue属性将不知道哪个列包含SelectedValue。

在绑定数据之前,请务必定义ValueMemberDisplayMember。像这样:

 //...
 lbTeam1Goal1.ValueMember = "PlayerID";
 lbTeam1Goal1.DisplayMember = "FullName";
 lbTeam1Goal1.DataSource = dtPlayers3; //databinding goes last

 lbTeam1Bookings1.ValueMember = "PlayerID";
 lbTeam1Bookings1.DisplayMember = "FullName";
 lbTeam1Bookings1.DataSource = dtPlayers3;

接下来,您没有使用参数,因为您的DataAdapter正在使用查询字符串而不是命令对象。试试这个:

 sqlPlayers3 = @" Select PlayerID, PlayerForename, PlayerSurname, PlayerAge, PlayerStatus, 
     (Playerforename +' '+Playersurname) as FullName from Player 
     where TeamID  = @cmb";
 SqlCommand cmd = new SqlCommand(sqlPlayers3); //SQL goes in the command constructor
 cmd.Parameters.AddWithValue("@cmb", int.Parse(cmbTeam1.SelectedValue.ToString()));

 String connStr5 = Properties.Resources.cString;
 //SqlDataAdapter daPlayer4 = new SqlDataAdapter(sqlPlayers3, Properties.Resources.cString); //not this way
 SqlDataAdapter daPlayer4 = new SqlDataAdapter(cmd, Properties.Resources.cString); //this will work better
 DataTable dtPlayers3 = new DataTable();
 daPlayer4.Fill(dtPlayers3);
 //...

在更改代码之前,您可能会发现在cmd.Parameters.AddWithValue行上放置断点很有意思。你会看到SelectedIndexChanged甚至开了3次:1)当你设置DataSource,2时设置ValueMember,3)设置DisplayMember时。更改后,当您设置DataSource时会触发一次。