我的代码出现问题,基本上我想要一个能够显示团队的组合框,当一个团队被选中时,它会在列表框中显示连接到该团队的玩家。问题是我有很多错误
以下是用团队填充组合框的代码
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#。我有什么遗漏或做错了吗?
答案 0 :(得分:1)
您的计划中有两个问题
您看到'Input string was not in correct format.'
的错误是由于ComboBox.SelectedIndexChanged()
事件处理程序在绑定数据后立即触发。在定义ValueMember
和DisplayMember
之前,您正在绑定数据。这意味着您的SelectedValue
属性将不知道哪个列包含SelectedValue。
在绑定数据之前,请务必定义ValueMember
和DisplayMember
。像这样:
//...
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
时会触发一次。