visual studio C#のwindowsフォームアプリケーションを使って写真投稿機能を作ろうとしています。
確実に実装したい機能は
・画像をファイルから選択(1枚)
・コメントと共に投稿
・画像とコメントを複数投稿&表示
イメージ
□タイトル
ーーーーーーーー
| |
| 画像 |
| |
ーーーーーーーー
コメント
□タイトル
ーーーーーーーー
| |
| 画像 |
| |
ーーーーーーーー
コメント
できればつけたい機能
チェックボックスなどを使ったお気に入り機能
投稿する時のウィンドウと表示するウィンドウは別でも構いません。
何かいい方法はありませんでしょうか?
よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/26 09:27
退会済みユーザー
2020/07/26 09:28
2020/07/26 09:31
2020/07/26 09:34
退会済みユーザー
2020/07/26 09:34
退会済みユーザー
2020/07/27 00:52
回答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エンコード(< を < に変える処理) 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総合スコア9862
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。