2017-05-16 6 views
2

私の問題の解決策を探しましたが、問題の解決策が見つからないため、別の投稿を作成する必要があります。C#データベースエラー、リストボックス内の項目を別のリストボックスから変更する

チームリストボックスで別のアイテムを選択すると、プレイヤーリストボックス内のアイテムを変更したいと考えています。

たとえばチームリストボックスでチーム1を選択すると、チーム1のプレイヤーをプレーヤーリストボックスに追加する必要があります。

私のプログラムはadapter.fill(playertable)部分に失敗し、私が取得エラー:私はプレーヤーとの間などassosiativeテーブルを働く選手、チームとteam_player、ある3つのSQLテーブルを作成している

System.ArgumentException : No mapping exists from object type System.Data.DataRowView to a known managed provider native type.

チーム。

また、チームリストボックスで選択したアイテムの値を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(); 
    } 
} 

}

+0

リストボックスをチームで埋めるクエリに_idteam_ Typoという名前のフィールドや重大なエラーがありませんか? – Steve

+1

プレイヤーに入力したクエリが間違っている(最後のフィールドの後にカンマ)これは入力ミスの場合があります。そうしないと、クエリの最初の使用時に構文エラー例外が発生します(クエリーテキストに_idplayer_がありません)。 – Steve

+0

クエリは機能し、私はそれをテストしました。私は構文エラーを取得していないので、私はこの投稿に誤字があると思います。私の選手のテーブルのプライマリキーはIdplayer、チームテーブルのプライマリキーはIdteam、assosiativeテーブルの外部キーはplayeridとteamidです。 – iFision

答えて

0

あなたの問題は、あなたがリストボックスを埋めるために使用したクエリのテキストで不足しているフィールドidplayerによって引き起こされる:

は、ここに私のコードです。このフィールドがなければ、ValueMemberプロパティをデータベースから取得していないフィールドに設定することは意味がありません。 SelectedValueを読み込もうとすると、バインドエンジンはコードに何を返すのかわからないので、DataTableをListBox(DataRowView)にバインドするために使用されるクラスの名前を返します。

ところで、ifあなたは、プロパティの順序は、あなたが問題

あなたがたValueMemberプロパティを設定すると

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

アンArgumentExceptionが発生したが....これを試してみては正確に何を伝える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"; 
が含まれるようにプレーヤーとチームクエリで両方のクエリを修正
+0

ありがとうSteve、今それは完全に動作します!問題は私の質問には当てはまらないと思っていましたが、主な問題はちょうどそのようでした:Dまあ、最悪の間違いはあなたが学ぶものです! – iFision

+0

助けになるのはうれしいです。あなたのサイトの新しいユーザーであることを私は[どのように答えを受け入れるか]を読むことをお勧めします(http://meta.stackoverflow.com/questions/5234/how-does-accepting-an-answer-work) – Steve

関連する問題