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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

3557閲覧

C#です。一度値の入った変数を空にしたいです。

pro-poke5

総合スコア46

C#

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2016/08/15 02:23

編集2016/08/15 02:38

こんにちわ。最近始めたばかりのプログラム初心者です。
VS2010、C#でデータベースから値をとってきて表に出力させたいです。

下のプログラムを実行するとboufuusetsuなどの変数に入った値が1度入ってしまうとずっと値が入ったままでうまく出力できません。
foreach文でループしてるためループがおわるごと変数を空に(null)にすればよいと考えたのですがうまくできません
また、このプログラムだと1行目だけ、最初のループでの出力がおかしいです。
(if文も多分おかしいです。oldCodeとcodeが同じであれば表の同じ行にデータを出力したいです)

空にするという考えがおかしいのでしょうか?
アドバイスお願いします。

C#

1 using (DataSet ds = whs.GetTestList(tblname)) 2 { 3 if (ds.Tables[tblname].Rows.Count > 0) //??? 4 { 5 6 string oldCode = string.Empty; 7 8 string boufuusetsu = string.Empty; 9 string teion = string.Empty; 10 string shimo = string.Empty; 11 string chakuhyo = string.Empty; 12 string chakusetsu = string.Empty; 13 14 sw.Write("<table border=1>"); 15 sw.Write("<tr><td> </td><td>暴風雪</td>"); 16 sw.Write("<td>低温</td><td>霧</td><td>着雪</td><td>着氷</td></tr>");//表のヘッダー 17 18 foreach (DataRow row in ds.Tables[tblname].Rows) 19 { 20 21 string name = row["area_name"].ToString(); 22 string code = row["area_cd"].ToString(); 23 string alrt = row["alert"].ToString();//番号 24 string alrtcode = row["alert_status_code"].ToString();//発表とか 25 string alrtname = row["alert_short_name"].ToString();//雷、暴風とか 26 27 string mark = string.Empty; 28 29 switch(alrtcode) 30 { 31 case "0"://発表 32 switch(alrt){ 33 case "32": 34 case "33": 35 case "38": 36 mark = "◆"; 37 //sw.Write("◆");//特別警報 38 break; 39 case "02": 40 case "08": 41 mark = "●";//警報 42 break; 43 case "13": 44 case "10": 45 case "27": 46 mark = "▲";//注意報 47 break; 48 } 49 break; 50 51 case "1"://警報から注意報 52 sw.Write("▽"); 53 break; 54 55 case "2"://継続 56 switch(alrt){ 57 case "32": 58 case "38": 59 mark = "◇";//特別警報 60 break; 61 case "02": 62 case "03": 63 case "08": 64 mark = "○";//特別警報 65 break; 66 case "13": 67 case "27": 68 mark = "△";//注意報 69 break; 70 } 71 break; 72 73 case "3"://解除 74 mark = "×"; 75 break; 76 77 case "4"://特別警報から警報 78 mark = "▼"; 79 break; 80 81 case "5"://警報から注意報 82 mark = "▽"; 83 break; 84 85 case null: 86 mark = " "; 87 break; 88 } 89 90 switch(alrtname) 91 { 92 case "暴風雪": 93 case "風雪": 94 boufuusetsu = mark; 95 break; 96 97 98 case "低温": 99 teion = mark; 100 break; 101 case "霜": 102 shimo = mark; 103 break; 104 case "着氷": 105 chakuhyo = mark; 106 break; 107 case "着雪": 108 chakusetsu = mark; 109 break; 110 } 111 112 if (code == oldCode) 113 { 114 115 } 116 else 117 { 118 sw.Write("<tr><td>" + name + "</td><td>" + boufuusetsu + "</td>"); 119 sw.Write("<td>" + teion + "</td>"); 120 sw.Write("<td>" + shimo + "</td>"); 121 sw.Write("<td>" + chakuhyo + "</td>"); 122 sw.Write("<td>" + chakusetsu + "</td></tr>"); 123 } 124 oldCode = code; 125 126 127 } 128 129 boufuusetsu = null; 130 teion = null; 131 shimo = null; 132 chakuhyo = null; 133 chakusetsu = null; 134 sw.Write("</table>"); 135 136 } 137 sw.Close(); 138 139 140 }

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

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

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

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

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

coco_bauer

2016/08/15 02:28

質問のコードでnullにしているのは oldBoufuusetsuです。boufuusetsuの値が変わる訳がありません。 落ち着いてコードを読み直しましょう!
pro-poke5

2016/08/15 02:37

すみません、コピペして削ったら誤った部分を残していました… 質問のコード修正しました このプログラムの間違いを探したいです よろしくお願いいたします。
guest

回答1

0

ベストアンサー

こんにちは。

foreach文でループしてるためループがおわるごと変数を空に(null)にすればよいと考えたのですがうまくできません

nullにしているのは、ループ内部ではなく全てのループが終わった後(foreachブロックの外)になってますよ。
ですので、当然ですが、ループ内部では一度設定した値がそのまま残ります。

(if文も多分おかしいです。oldCodeとcodeが同じであれば表の同じ行にデータを出力したいです)

現在の構造では、1行に1つの警報しか出力できないと思います。
1行に複数の警報を出力したい場合、foreachでスキャンして同じarea_cd毎に警報情報を集め、そのforeachループが終わってから、集めた警報情報をarea_cd毎に出力する必要があると思います。つまり、2回ループを回すことになります。
area_cd毎に警報情報を集める際にはDictionaryを使えば楽と思います。

更に具体的には、まずは判る範囲でトライされてから別途質問した方がスムーズと思いますよ。

投稿2016/08/15 02:46

Chironian

総合スコア23272

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

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

pro-poke5

2016/08/15 05:20

ありがとうございます。 すみません、Directryはif文のoldCode=codeの場合の時に入れるべきでしょうか? 調べたのですがDirctryの使い方がいまいちよくわからなくて…すみません
Chironian

2016/08/15 08:03

DirectryではなくDictionary(辞書)ですが、まだそこまで進むのは早過ぎるように感じます。 「表の同じ行にデータを出力する」ためには、何をするべきかよく考えましょう。 一度行を出力してしまったら、その行を修正することはできませんよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問