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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

1回答

1513閲覧

visual studio C#で写真投稿機能を作りたい

nachann

総合スコア3

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2020/07/26 08:18

visual studio C#のwindowsフォームアプリケーションを使って写真投稿機能を作ろうとしています。
確実に実装したい機能は
・画像をファイルから選択(1枚)
・コメントと共に投稿
・画像とコメントを複数投稿&表示
イメージ

□タイトル
ーーーーーーーー
|        |
|   画像   |
|        |
ーーーーーーーー
コメント

□タイトル
ーーーーーーーー
|        |
|   画像   |
|        |
ーーーーーーーー
コメント

できればつけたい機能 
チェックボックスなどを使ったお気に入り機能

投稿する時のウィンドウと表示するウィンドウは別でも構いません。
何かいい方法はありませんでしょうか?
よろしくお願いいたします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/07/26 08:22

ListView を使えばいいんじゃないでしょうか。
Zuishin

2020/07/26 09:27

https://teratail.com/help > 他のサービスにも質問投稿をしたい(してしまった) > teratailでは、マルチポスト※の推奨はしていません。 > やむを得ず複数のサイトに質問を投稿された場合は、質問内容にマルチポストをする理由を書き、他のサイトの投稿へのリンクを貼ってください。また、解決した際には必ずteratail及びすべての投稿に解決した旨と、どのように解決したかを記載してください。 https://qiita.com/natsumin2103/questions/bf5a3135428a91d3d79e
退会済みユーザー

退会済みユーザー

2020/07/26 09:28

> windowsフォームアプリケーションを使って写真投稿機能を作ろうとしています。 投稿という言葉からは、特定の Web サイトに複数のユーザーが画像をアップロードして、それを複数のユーザーが閲覧するようなイメージなんですが、そういうのとは違うのですか? Windows Forms アプリで画像を投稿? 何かまったく見当違いのことを考えてませんか?
nachann

2020/07/26 09:31

投稿という言い方はあっていませんでしたね、、、 自分のフォルダから画像を選択して複数表示できるようなものをかんがえていました。
Zuishin

2020/07/26 09:34

https://teratail.com/help > 他のサービスにも質問投稿をしたい(してしまった) > teratailでは、マルチポスト※の推奨はしていません。 > やむを得ず複数のサイトに質問を投稿された場合は、質問内容にマルチポストをする理由を書き、他のサイトの投稿へのリンクを貼ってください。また、解決した際には必ずteratail及びすべての投稿に解決した旨と、どのように解決したかを記載してください。
退会済みユーザー

退会済みユーザー

2020/07/26 09:34

何はともあれマルチポストは止めましょう。自分さえよければいいという匂いがプンプンするので、相手にする気がしなくなります。
退会済みユーザー

退会済みユーザー

2020/07/27 00:52

qiita の投稿は Not Found になってますが、削除したのですか? 削除しないで、Teratail の URL を書いてこちらに一本化したと通知した方がよいのでは? qiita の投稿を見て考えてくれた回答者・閲覧者もおられることでしょうし。 あと、Zuishin さんからの ListView を使うという提案に対して返事しませんか?
guest

回答1

0

何かいい方法はありませんでしょうか?

できるだけ簡単な方法を考えていたのですが、一応めどが立ったので一案として試してみてください(簡単を最優先したので、とても正攻法とは言えません^^;

cs

1using System; 2using System.Drawing; 3using System.IO; 4using System.Net; 5using System.Windows.Forms; 6 7namespace Questions280412 8{ 9 public partial class Form1 : Form 10 { 11 public Form1() 12 { 13 InitializeComponent2(); 14 15 try 16 { 17 // 保存済みファイルがあれば読み込み 18 webBrowser1.DocumentText = File.ReadAllText("Questions280412.html"); 19 } 20 catch 21 { 22 // なければ空文字に(何かは入れないとNullReferenceExceptionが出る) 23 webBrowser1.DocumentText = ""; 24 } 25 26 // フォント変更 27 webBrowser1.DocumentCompleted += (s, e) => webBrowser1.Document.Body.Style = "font-family:メイリオ;"; 28 } 29 30 private void Form1_FormClosing(object sender, FormClosingEventArgs e) 31 { 32 // 終了時に自動保存 33 // 次回起動時のためdivを表示に戻しておく 34 foreach(HtmlElement div in webBrowser1.Document.GetElementsByTagName("div")) 35 { 36 div.Style = "display:block"; 37 } 38 39 // ファイルが書き込めないと例外 40 // webBrowser1.DocumentTextだと INPUT CHECKED が反映されないので注意 41 File.WriteAllText("Questions280412.html", webBrowser1.Document.Body.InnerHtml); 42 } 43 44 private void SelectImageButton_Click(object sender, EventArgs e) 45 { 46 using(var dlg = new OpenFileDialog()) 47 { 48 dlg.Filter = "画像ファイル(*.png;*.jpg;*.gif)|*.png;*.jpg;*.gif|すべてのファイル(*.*)|*.*"; 49 if(dlg.ShowDialog() == DialogResult.OK) 50 { 51 fileTextBox.Text = dlg.FileName; 52 } 53 } 54 } 55 56 57 // 1投稿分のテンプレート 58 private const string template = @" 59<div> 60 <h1>{{title}}</h1> 61 <img src='{{file}}' /> 62 <br /> 63 <pre>{{comment}}</pre> 64 <label> 65 <input type='checkbox' name='like'>お気に入り 66 </label> 67 <hr /> 68</div>"; 69 70 private void PostButton_Click(object sender, EventArgs e) 71 { 72 // HTMLエンコード(< を &lt; に変える処理) 73 var title = WebUtility.HtmlEncode(titleTextBox.Text); 74 var file = WebUtility.HtmlEncode(fileTextBox.Text); 75 var comment = WebUtility.HtmlEncode(commentTextBox.Text); 76 77 // テンプレートの指定部分と置換 78 var html = template.Replace("{{title}}", title) 79 .Replace("{{file}}", file) 80 .Replace("{{comment}}", comment); 81 82 //webBrowser1.DocumentText += html; // だとダメ 83 webBrowser1.Document.Body.InnerHtml += html; // 投稿追加 84 // お気に入り状態で追加されるといろいろ面倒なのでぜんぶに戻す 85 allRadioButton.Checked = true; 86 } 87 88 private void AllRadioButton_CheckedChanged(object sender, EventArgs e) 89 { 90 // divタグを全列挙 91 foreach(HtmlElement div in webBrowser1.Document.GetElementsByTagName("div")) 92 { 93 // divを表示に戻す 94 div.Style = "display:block"; 95 } 96 } 97 98 private void LikeRadioButton_CheckedChanged(object sender, EventArgs e) 99 { 100 // 全体から name='like' のものを全列挙 101 foreach(HtmlElement checkbox in webBrowser1.Document.All.GetElementsByName("like")) 102 { 103 // チェックボックスがチェックされていなければ... 104 if(checkbox.GetAttribute("checked") == "False") 105 { 106 // div(チェックボックスの親の親)を非表示にする 107 checkbox.Parent.Parent.Style = "display:none"; 108 } 109 } 110 } 111 112 113 114 // InitializeComponent()を圧縮 115 private void InitializeComponent2() 116 { 117 ((System.ComponentModel.ISupportInitialize)splitContainer1).BeginInit(); 118 splitContainer1.Panel1.SuspendLayout(); 119 splitContainer1.Panel2.SuspendLayout(); 120 splitContainer1.SuspendLayout(); 121 SuspendLayout(); 122 123 // splitContainer1 124 splitContainer1.Dock = DockStyle.Fill; 125 126 // splitContainer1.Panel1 127 splitContainer1.Panel1.Controls.Add(label3); 128 splitContainer1.Panel1.Controls.Add(label2); 129 splitContainer1.Panel1.Controls.Add(label1); 130 splitContainer1.Panel1.Controls.Add(postButton); 131 splitContainer1.Panel1.Controls.Add(selectImageButton); 132 splitContainer1.Panel1.Controls.Add(commentTextBox); 133 splitContainer1.Panel1.Controls.Add(fileTextBox); 134 splitContainer1.Panel1.Controls.Add(titleTextBox); 135 136 // splitContainer1.Panel2 137 splitContainer1.Panel2.Controls.Add(likeRadioButton); 138 splitContainer1.Panel2.Controls.Add(allRadioButton); 139 splitContainer1.Panel2.Controls.Add(webBrowser1); 140 splitContainer1.Size = new Size(800, 450); 141 splitContainer1.SplitterDistance = 408; 142 143 // label3 144 label3.AutoSize = true; 145 label3.Location = new Point(14, 69); 146 label3.Text = "コメント"; 147 148 // label2 149 label2.AutoSize = true; 150 label2.Location = new Point(12, 44); 151 label2.Text = "画像パス"; 152 153 // label1 154 label1.AutoSize = true; 155 label1.Location = new Point(12, 15); 156 label1.Text = "タイトル"; 157 158 // postButton 159 postButton.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; 160 postButton.Location = new Point(321, 415); 161 postButton.Size = new Size(75, 23); 162 postButton.Text = "投稿"; 163 postButton.UseVisualStyleBackColor = true; 164 postButton.Click += PostButton_Click; 165 166 // selectImageButton 167 selectImageButton.Anchor = AnchorStyles.Top | AnchorStyles.Right; 168 selectImageButton.Location = new Point(299, 37); 169 selectImageButton.Size = new Size(97, 23); 170 selectImageButton.Text = "画像を選択..."; 171 selectImageButton.UseVisualStyleBackColor = true; 172 selectImageButton.Click += SelectImageButton_Click; 173 174 // commentTextBox 175 commentTextBox.AcceptsReturn = true; 176 commentTextBox.AcceptsTab = true; 177 commentTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; 178 commentTextBox.Location = new Point(66, 66); 179 commentTextBox.Multiline = true; 180 commentTextBox.Size = new Size(330, 343); 181 182 // fileTextBox 183 fileTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; 184 fileTextBox.Location = new Point(66, 41); 185 fileTextBox.Size = new Size(227, 19); 186 187 // titleTextBox 188 titleTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; 189 titleTextBox.Location = new Point(66, 12); 190 titleTextBox.Size = new Size(330, 19); 191 192 // likeRadioButton 193 likeRadioButton.Appearance = Appearance.Button; 194 likeRadioButton.AutoSize = true; 195 likeRadioButton.Location = new Point(54, 5); 196 likeRadioButton.TabStop = true; 197 likeRadioButton.Text = "お気に入り"; 198 likeRadioButton.UseVisualStyleBackColor = true; 199 likeRadioButton.CheckedChanged += LikeRadioButton_CheckedChanged; 200 201 // allRadioButton 202 allRadioButton.Appearance = Appearance.Button; 203 allRadioButton.AutoSize = true; 204 allRadioButton.Checked = true; 205 allRadioButton.Location = new Point(3, 5); 206 allRadioButton.TabStop = true; 207 allRadioButton.Text = "ぜんぶ"; 208 allRadioButton.UseVisualStyleBackColor = true; 209 allRadioButton.CheckedChanged += AllRadioButton_CheckedChanged; 210 211 // webBrowser1 212 webBrowser1.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; 213 webBrowser1.Location = new Point(3, 33); 214 webBrowser1.MinimumSize = new Size(20, 20); 215 webBrowser1.Size = new Size(382, 414); 216 217 // Form1 218 AutoScaleDimensions = new SizeF(6F, 12F); 219 AutoScaleMode = AutoScaleMode.Font; 220 ClientSize = new Size(800, 450); 221 Controls.Add(splitContainer1); 222 Text = "Form1"; 223 FormClosing += Form1_FormClosing; 224 splitContainer1.Panel1.ResumeLayout(false); 225 splitContainer1.Panel1.PerformLayout(); 226 splitContainer1.Panel2.ResumeLayout(false); 227 splitContainer1.Panel2.PerformLayout(); 228 ((System.ComponentModel.ISupportInitialize)(splitContainer1)).EndInit(); 229 splitContainer1.ResumeLayout(false); 230 ResumeLayout(false); 231 } 232 233 private SplitContainer splitContainer1 = new SplitContainer(); 234 private WebBrowser webBrowser1 = new WebBrowser(); 235 private Label label3 = new Label(); 236 private Label label2 = new Label(); 237 private Label label1 = new Label(); 238 private Button postButton = new Button(); 239 private Button selectImageButton = new Button(); 240 private TextBox commentTextBox = new TextBox(); 241 private TextBox fileTextBox = new TextBox(); 242 private TextBox titleTextBox = new TextBox(); 243 private RadioButton likeRadioButton = new RadioButton(); 244 private RadioButton allRadioButton = new RadioButton(); 245 } 246}

アプリ画像
注意
Form1.Designer.csのままだと1万字に収まらないので、しかたなくInitializeComponent2を作成。
いろいろ気が利かない部分があります(改善の余地を残しています^^;
大量にアイテムがあると、投稿後のお気に入りへの切り替えが激遅い。

投稿2020/07/27 11:05

編集2023/07/22 09:29
TN8001

総合スコア9862

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問