繁体   English   中英

C#数据库错误,从另一个列表框中更改列表框中的项目

[英]C# database error, Changing items in listbox from another listbox

我已经搜索了问题的答案,但是找不到专门针对我问题的解决方案,因此我不得不发表另一篇文章。

当我在团队列表框中选择另一个项目时,我想更改玩家列表框中的项目。

例如,如果我在“团队”列表框中选择“ team1”,则应该在“玩家”列表框中获取“团队1”的玩家。

我的程序在adapter.fill(playertable)部分失败,出现错误:

System.ArgumentException:不存在从对象类型System.Data.DataRowView到已知的托管提供程序本机类型的映射。

我创建了3个sql表,分别是player,team和team_player,用作玩家和team之间的关联表。

另外,如果我尝试通过Messagebox.Show(listboxpteams.SelectedValue.ToString())获取“团队”列表框中所选项目的值,则不会得到该值,但会得到System.Data.DataRowView。

这是我的代码:

public partial class Form2 : Form
{
    SqlConnection connection;
    string connectionString;
    public Form2()
    {
        InitializeComponent();

        connectionString = ConfigurationManager.ConnectionStrings["Peehootee.Properties.Settings.playersConnectionString"].ConnectionString;
    }

    private void Form2_Load (object sender, EventArgs e)
    {

        fillteams();

    }

    private void fillteams()
    {
        using (connection = new SqlConnection(connectionString))
        using (SqlDataAdapter adapter = new SqlDataAdapter("SELECT name  FROM team", connection))
        {
            DataTable teamtable = new DataTable();
            adapter.Fill(teamtable);

            listboxteams.DisplayMember = "name";
            listboxteams.ValueMember = "Idteam";
            listboxteams.DataSource = teamtable;
        }
    }
    private void populateplayers()
    {
        String query = "Select a.firstname+ ' ' + a.surname AS Name, From player a inner JOIN team_player b on a.Idplayer = b.playerid where b.teamid = @Idteam";
        using (connection = new SqlConnection(connectionString))
        using (SqlCommand command = new SqlCommand(query, connection))
        using (SqlDataAdapter adapter = new SqlDataAdapter(command))
        {
              command.Parameters.AddWithValue("@Idteam",listboxteams.selectedvalue);

            DataTable playertable = new DataTable();
            adapter.Fill(playertable);
            listboxplayers.Displaymember = "Name";
            listboxplayers.ValueMember = "Idplayer";
            listboxplayers.DataSource = playertable;

        }
    }

    private void Form2_FormClosed(object sender, FormClosedEventArgs e)
    {
        Application.Exit();
    }

    private void listboxteams_SelectedIndexChanged(object sender, EventArgs e)
    {
       populateplayers();
    }
}

}

您的问题是由用于填充列表框的查询文本中缺少字段idplayer引起的。 没有此字段,将ValueMember属性设置为尚未从数据库中检索到的字段是没有意义的。 当您尝试读取SelectedValue时,绑定引擎不知道要返回什么代码,因此它返回用于将DataTable绑定到ListBox的类的名称(DataRowView)。

顺便说一句,如果您交换属性设置的顺序,则会得到一个ArgumentException,确切说明问题是什么

尝试这个....

listboxplayers.DataSource = playertable;
listboxplayers.Displaymember = "Name";
listboxplayers.ValueMember = "Idplayer";

设置ValueMember属性时,会发生ArgumentException。

修正玩家和团队查询中的查询,以包括idplayeridteam

首先在这里...

using (SqlDataAdapter adapter = new SqlDataAdapter("SELECT idteam, name FROM team", connection))

并且 ....

String query = @"Select a.idplayer, 
                        a.firstname+ ' ' + a.surname AS Name 
                 From player a inner JOIN team_player b 
                          on a.Idplayer = b.playerid 
                 where b.teamid = @Idteam";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM