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

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

ただいまの
回答率

90.49%

  • HTML

    11787questions

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

  • C#

    9211questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 806

pro-poke5

score 37

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

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

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

using (DataSet ds = whs.GetTestList(tblname))
            {
                if (ds.Tables[tblname].Rows.Count > 0) //???
                {

                    string oldCode = string.Empty;

                    string boufuusetsu = string.Empty;
                    string teion = string.Empty;
                    string shimo = string.Empty;
                    string chakuhyo = string.Empty;
                    string chakusetsu = string.Empty;

                    sw.Write("<table border=1>");
                    sw.Write("<tr><td>     </td><td>暴風雪</td>");
                    sw.Write("<td>低温</td><td>霧</td><td>着雪</td><td>着氷</td></tr>");//表のヘッダー

                    foreach (DataRow row in ds.Tables[tblname].Rows)
                    {

                        string name = row["area_name"].ToString();
                        string code = row["area_cd"].ToString();
                        string alrt = row["alert"].ToString();//番号
                        string alrtcode = row["alert_status_code"].ToString();//発表とか
                        string alrtname = row["alert_short_name"].ToString();//雷、暴風とか

                        string mark = string.Empty;

                        switch(alrtcode)
                        {
                             case "0"://発表
                               switch(alrt){
                                    case "32":
                                    case "33":
                                    case "38":
                                        mark = "◆";
                                    //sw.Write("◆");//特別警報             
                                break;
                                    case "02":
                                    case "08":
                                        mark = "●";//警報             
                               break;
                                    case "13":
                                    case "10":
                                    case "27":
                                        mark = "▲";//注意報           
                                 break;
                                }
                            break;

                           case "1"://警報から注意報
                                    sw.Write("▽");
                                break;

                           case "2"://継続
                                switch(alrt){
                                    case "32":
                                    case "38":
                                    mark = "◇";//特別警報 
                                 break;
                                    case "02":
                                    case "03":
                                    case "08":
                                    mark = "○";//特別警報 
                                 break;
                                    case "13":
                                    case "27":
                                        mark = "△";//注意報
                                 break;
                                }
                               break;

                            case "3"://解除                              
                                     mark = "×";                                  
                                        break;

                            case "4"://特別警報から警報
                                    mark = "▼";
                                break;

                            case "5"://警報から注意報
                                    mark = "▽";                           
                                break;

                            case null:
                                mark = "  ";
                                break;
                        }

                        switch(alrtname)
                        {
                            case "暴風雪":
                            case "風雪":
                                boufuusetsu = mark;
                            break;


                            case "低温":
                                 teion = mark;
                            break;
                            case "霜":
                                 shimo = mark;
                            break;
                            case "着氷":
                                 chakuhyo = mark;
                                break;
                            case "着雪":
                                 chakusetsu = mark;
                            break;
                        }

                        if (code == oldCode)
                        {

                        }
                        else
                        {
                            sw.Write("<tr><td>" + name + "</td><td>" + boufuusetsu + "</td>");
                            sw.Write("<td>" + teion + "</td>");
                            sw.Write("<td>" + shimo + "</td>");
                            sw.Write("<td>" + chakuhyo + "</td>");
                            sw.Write("<td>" + chakusetsu + "</td></tr>");
                        }
                        oldCode = code;


                    }

                    boufuusetsu = null;
                    teion = null;
                    shimo = null;
                    chakuhyo = null;
                    chakusetsu = null;
                    sw.Write("</table>");   

                }
                sw.Close();


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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • coco_bauer

    2016/08/15 11:28

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

    キャンセル

  • pro-poke5

    2016/08/15 11:37

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

    キャンセル

回答 1

checkベストアンサー

+1

こんにちは。

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/15 14:20

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

    キャンセル

  • 2016/08/15 17:03

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

    キャンセル

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

  • HTML

    11787questions

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

  • C#

    9211questions

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