Q&A
###前提・実現したいこと
Visual Studio 2015 にてC#を使いWindows Formsのアプリケーションを開発しています。
データベースはPostgreSQL(9.5)
Npgsql(3.1.9)を使用し、データベースにアクセスしています。
今回実現したいことは、Form1(↓画像1番目)の画像選択ボタンを押すと、Form2(↓画像2番目)に移動し、Form2にて画像をダブルクリックすると、Form1のpicturebox1に画像が入り(←ここまで自分で解決済み)、さらにデータベースに画像を格納することです。また、データベースに格納した画像は、別のフォームで使用しPictureBoxなどで表示します。
しかし、PictureBoxに表示された画像をデータベースに格納する方法、またデータベースに格納された画像を表示する方法がわかりません。
お教えいただけないでしょうか
Form1
Form2
###該当のソースコード
Form1()
C#
1using System.ComponentModel; 2using System.Data; 3using System.Drawing; 4using System.Linq; 5using System.Text; 6using System.Threading.Tasks; 7using System.Windows.Forms; 8using System.IO; 9using System.Diagnostics; 10 11namespace WindowsFormsApplication1 12{ 13 public partial class TRDetailsEdit : Form 14 { 15 public PictureBox pb { get; internal set; } 16 17 public TRDetailsEdit() 18 { 19 InitializeComponent(); 20 } 21 22 private void TRDetailsEdit_Load(object sender, EventArgs e) 23 { 24 if (pb != null) 25 pictureBox1.Image = pb.Image; 26 } 27 28 private void button4_Click(object sender, EventArgs e) 29 { 30 WindowsFormsApplication1.ImageExplorer ie = new ImageExplorer(); 31 ie.Show(); 32 Close(); 33 } 34 } 35}
Form2
C#
1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10using System.IO; 11using System.Diagnostics; 12 13namespace WindowsFormsApplication1 14{ 15 public partial class ImageExplorer : Form 16 {###ヘディングのテキスト 17 public ImageExplorer() 18 { 19 InitializeComponent(); 20 } 21 22 private void ImageExplorer_Load(object sender, EventArgs e) 23 { 24 comboBox1.SelectedIndex = 0; 25 } 26 27 private void pictureBox_DoubleClick(object sender, EventArgs e) 28 { 29 PictureBox pb = (PictureBox)sender; 30 WindowsFormsApplication1.TRDetailsEdit trde = new TRDetailsEdit(); 31 trde.pb = pb; 32 trde.Show(); 33 Close(); 34 } 35 private void CreateThumbnails(string path) 36 { 37 string[] filePaths; 38 int count = 0; 39 40 foreach (PictureBox pb in flowLayoutPanel1.Controls) 41 { 42 Image img = pb.Image; 43 pb.Image = null; 44 img.Dispose(); 45 } 46 47 flowLayoutPanel1.Controls.Clear(); 48 49 filePaths = Directory.GetFiles(path); //指定されたフォルダー内のファイルのパスのコレクションを取得 50 foreach (string filePath in filePaths) //ファイルのパスのコレクションから1つずつパスを取得 51 { 52 try 53 { 54 //指定されたパスのファイルからサムネイル用のイメージを作成 55 Image img1 = Bitmap.FromFile(filePath); 56 Image img2 = img1.GetThumbnailImage(350, 245, null, IntPtr.Zero); 57 img1.Dispose(); 58 59 PictureBox pb = new PictureBox(); 60 pb.Margin = new Padding(10); 61 pb.Image = img2; 62 pb.SizeMode = PictureBoxSizeMode.AutoSize; 63 pb.Tag = filePath; 64 pb.DoubleClick += new EventHandler(pictureBox_DoubleClick); 65 flowLayoutPanel1.Controls.Add(pb); 66 67 toolTip1.SetToolTip(pb, Path.GetFileName(filePath)); 68 count++; 69 } 70 catch 71 { 72 //続行してコレクションの次の要素を処理 73 } 74 } 75 76 if (count == 0) 77 MessageBox.Show("イメージファイルが見つかりませんでした。", button1.Text, MessageBoxButtons.OK, MessageBoxIcon.Information); 78 } 79 80 private void button1_Click(object sender, EventArgs e) 81 { 82 if (folderBrowserDialog1.ShowDialog() == DialogResult.OK) 83 { 84 textBox1.Text = folderBrowserDialog1.SelectedPath; 85 CreateThumbnails(folderBrowserDialog1.SelectedPath); 86 } 87 } 88 89 private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 90 { 91 flowLayoutPanel1.FlowDirection = 92 (FlowDirection)comboBox1.SelectedIndex; 93 } 94 } 95}
###参考程度にNpgsqlを使用したデータベースアクセス(今回のFormとはつながりはありません。)
C#
1private void connectDatebase() 2 { 3 StringBuilder sb = new StringBuilder(); 4 sb.Append("Server=localhost;"); 5 sb.Append("Port=5433;"); 6 sb.Append("User Id=postgres;"); 7 sb.Append("Password=***;"); //インストール時入れた値 8 sb.Append("Database=db_football;"); 9 10 string connString = sb.ToString(); 11 12 using (var con = new NpgsqlConnection(connString)) 13 { 14 try 15 { 16 con.Open(); 17 18 //データ検索 19 var cmd = new NpgsqlCommand(@"select schedule1,schedule2,schedule3,schedule4,schedule5,schedule6,schedule7,schedule8,schedule9,schedule10 from tb_calendar where year = :year and month = :month and day = :day;", con); 20 cmd.Parameters.Add(new NpgsqlParameter("year", DbType.Int32) { Value = year }); 21 cmd.Parameters.Add(new NpgsqlParameter("month", DbType.Int32) { Value = month }); 22 cmd.Parameters.Add(new NpgsqlParameter("day", DbType.Int32) { Value = day }); 23 var dataReader = cmd.ExecuteReader(); //クエリを取得 24 25 label2.Text = dataReader.HasRows.ToString(); 26 27 if (dataReader.HasRows) 28 { 29 while (dataReader.Read()) //レコードを進める 30 { 31 //Console.WriteLine("{0}", dataReader["schedule1"]); 32 //int y = int.Parse(dataReader["year"].ToString()); 33 34 label4.Text = dataReader["schedule1"].ToString(); 35 label5.Text = dataReader["schedule2"].ToString(); 36 label6.Text = dataReader["schedule3"].ToString(); 37 label7.Text = dataReader["schedule4"].ToString(); 38 label3.Text = dataReader["schedule5"].ToString(); 39 label9.Text = dataReader["schedule6"].ToString(); 40 label10.Text = dataReader["schedule7"].ToString(); 41 label11.Text = dataReader["schedule8"].ToString(); 42 label12.Text = dataReader["schedule9"].ToString(); 43 label13.Text = dataReader["schedule10"].ToString(); 44 } 45 //Console.Read(); 46 dataReader.Close(); 47 } 48 else 49 { 50 var cmd2 = new NpgsqlCommand(@"insert into tb_calendar values (null,'2016-9-12',null,null,null,null,null,null,null,null,null,null,:year,:month,:day)", con); 51 cmd2.Parameters.Add(new NpgsqlParameter("year", DbType.Int32) { Value = year }); 52 cmd2.Parameters.Add(new NpgsqlParameter("month", DbType.Int32) { Value = month }); 53 cmd2.Parameters.Add(new NpgsqlParameter("day", DbType.Int32) { Value = day }); 54 dataReader.Close(); 55 var dataReader2 = cmd2.ExecuteReader(); 56 } 57 } 58 catch (Exception e) 59 { 60 MessageBox.Show(e.ToString()); 61 } 62 } 63 }
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2016/12/04 09:22