質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

解決済

SQL Severから取得した値を WindowsFormsAppのclass Form1のlistboxに表示するようなシステムについて

Erizabesu_Queen
Erizabesu_Queen

総合スコア1

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

2回答

0グッド

0クリップ

339閲覧

投稿2022/11/12 02:08

編集2022/11/12 03:27

C#のlistについての質問です。
質問を投稿するのも初めてなので、至らない点が多々あると思いますがよろしくお願いします。

Windows 10 の Visual Studio 2022 で Windows Forms アプリをターゲットフレームワーク .NET Framework 4.8 で作っています
SQL Server のバージョン・エディションは、2022でlocalDBで作っております

SQL Severから取得した値をフィールドのListに格納し、
WindowsFormApplicationのclass Form1のlistboxに表示するようなシステム
を考えております。

質問事項:
SQL Severから取得した値をフィールドのListに格納できても、
(☆class1.Select();での処理ではうまく格納できている)
★への処理に移ると、データがリセットしてしまいます。
(ID.Countが0になるため、データを表示できない)

どうしたら☆class1.Select();での処理したフィールド変数の値を保持したまま
★の処理に移行できますか。

以下コード:

class Form1    //フィールド変数の定義    public string abc = "{0,-10}{1,-20}"; private List<string> id { get; set; } = new List<string>(); public List<string> ID { get => id; set => id=value; } private List<string> country { get; set; } = new List<string>(); public List<string> Country { get => country; set => country=value;}     private void Form1_Load(object sender, EventArgs e) { listBox1.Items.Add(string.Format(abc, "id", "country"));     ☆// SQL Serverからデータの抽出処理 Class1 class1 = new Class1(); class1.Select();          ★//Form1のlistboxに追加 for (int i = 0; i < ID.Count; i++) { listBox1.Items.Add(string.Format(abc, id[i], country[i])); }      } class Class1 internal class Class1:Form1 { public void Select() { //SQL Serverに接続処理       //抽出処理 cmd.CommandText = "SELECT * FROM Countrys"; SqlDataReader dr = cmd.ExecuteReader();             while (dr.Read()) { string aa = dr["country_id"].ToString(); string bb = dr["country"].ToString();       //フィールド変数に格納 this.ID.Add(aa); this.Country.Add(bb); }      SQL Serverに接続切断処理    }

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

matukeso

2022/11/12 02:25

class1のID、Countryは定義が書いてないけど、どこから生えてきたの?Form1のインスタンスを指す処理がどこかについてるの? それとも、単に同名な別インスタンス?
SurferOnWww

2022/11/12 02:29 編集

まず、何はともあれコードは上下を ``` と ``` で囲ってください(``` はバッククォート 3 つ)。インデントされて読みやすくなるので。 何を何で作っているか書いてください。(例: Windows 10 の Visual Studio 2022 で Windows Forms アプリをターゲットフレームワーク .NET Framework 4.8 で作っています・・・とか) SQL Server のバージョン・エディションを書いてください。LocalDB でないとすると、アプリからの接続のための設定、ログインのための設定などいろいろ事前準備が必要ですが、ちゃんとできてますか?
Erizabesu_Queen

2022/11/12 03:17

matukesoさん 見てくださり、ありがとうございます。 Form1のインスタンスを指しています。 internal class Class1:Form1 { を追記いたしました
Erizabesu_Queen

2022/11/12 03:20

SurferOnWwwさん 見てくださりありがとうございます。 初めての質問で至らない点多々あり、申し訳ございません。 ご指摘いただいた点は追記いたしました。 よろしくお願いいたします。

回答2

0

ベストアンサー

Class1がForm1を継承しているなら、Form1_Loadの実行主体(this)の持つIDと、new Class1してできるclass1の持つIDは、別のインスタンスですよ。

こうすれば、違いがわかるとは思います。thisのIDはカラで、class1のIDは埋まっているわけです

csharp

1 Class1 class1 = new Class1(); 2 class1.Select(); 3 for (int i = 0; i < class1.ID.Count; i++) 4 { 5 listBox1.Items.Add(string.Format(abc, class1.ID[i], class1.Country[i])); 6 }

根本的には、Class1でForm1の継承をやめてID,Countryをコンストラクタでもらうようにするとか、
class1が持つとして、Select後にID,Countryをコピーするとかのほうがいいとは思いますけど。

csharp

1internal class Class1 2{ 3 private readonly List<string> ID; 4 private readonly List<string> Country; 5 internal Class1(List<string> id, List<string> country){ 6 ID=id; Country=country; 7 } 89}

投稿2022/11/12 04:11

matukeso

総合スコア1425

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

Erizabesu_Queen

2022/11/12 10:39

解決しました。ありがとうございます!
Erizabesu_Queen

2022/11/15 08:50 編集

実装してみて、質問事項出来たので、質問させていただきます。 ``` Class class1 internal class Class1 { private readonly List<string> ID; private readonly List<string> Country; internal Class1(List<string> id, List<string> country){ ID=id; Country=country; } … } ``` と実装した際に、なぜForm1のid、countryのlistに追加できるのでしょうか。 Class1内の「readonly」 を使うと読み取り専用になるし、そもそもForm1のlist に追加する記述がないように感じます。 初心者的な質問であり申し訳ございません。よろしくお願いいたします。
matukeso

2022/11/15 08:16

コンストラクタでForm1のidへの参照をわたす前提なのでform1.idとclass1.IDは同じList Objectを指すようになります。 Class1のIDにつくReadonlyはIDの指す先を変えられない、という意味です。
Erizabesu_Queen

2022/11/15 10:01

同じList Objectを指すというところってつまり下記のコードがあるからってことの認識でよろしいでしょうか。 internal Class1(List<string> id, List<string> country){ ID=id; Country=country; }
Erizabesu_Queen

2022/11/15 13:42

なるほど、、、 わかりやすく丁寧な回答していただきありがとうございました。

0

SQL Server のテーブルから DataTable を作成して、それを ListBox.DataSource プロパティに代入するようにしてはいかがですか?

例えば以下のような SQL Server のテーブルから、

イメージ説明

以下のようなコードで SqlDataAdapter を利用して DataTable を作成し、それを ListBox.DataSource プロパティに代入すると、

C#

1using System; 2using System.Data; 3using System.Data.SqlClient; 4using System.Windows.Forms; 5 6namespace WindowsFormsApp1 7{ 8 public partial class Form12 : Form 9 { 10 DataTable table; 11 12 public Form12() 13 { 14 InitializeComponent(); 15 } 16 17 private void Form12_Load(object sender, EventArgs e) 18 { 19 var connString = "Data Source=lpc:(local)\\sqlexpress;Initial Catalog=NORTHWIND;Integrated Security=True"; 20 var selectQuery = "SELECT CategoryID, CategoryName FROM Categories"; 21 22 this.table = new DataTable(); 23 using (var connection = new SqlConnection(connString)) 24 { 25 using (var command = new SqlCommand(selectQuery, connection)) 26 { 27 var adapter = new SqlDataAdapter(command); 28 adapter.Fill(table); 29 } 30 } 31 32 this.listBox1.DataSource = table; 33 this.listBox1.DisplayMember = "CategoryName"; 34 this.listBox1.ValueMember = "CategoryID"; 35 } 36 } 37}

結果は以下のようになります。

イメージ説明

投稿2022/11/12 03:44

SurferOnWww

総合スコア17344

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

Erizabesu_Queen

2022/11/12 11:52

こんな技術があるなんて知りませんでした。 教えてくださり、ありがとうございます!

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。