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

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

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

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

Q&A

解決済

2回答

8540閲覧

C#で表をHTMLで書き込みたいです。

pro-poke5

総合スコア46

C#

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

0グッド

0クリップ

投稿2016/08/04 02:13

編集2016/08/04 04:51

C#でデータベースからとってきた値を
HTMLで表にしたいです。
nameとmrkがデータベースからとってきたものです。
別ファイルにはとってくるSQL(selectぶん)が書いてあります。

sw.Write("<table border=1>");
sw.Write("<tr><td> </td><td></td> <td></td> <td></td><td></td></tr>");

foreach (DataRow row in ds.Tables[tblname].Rows) { string work = row["name"].ToString(); string work2 = row["mark"].ToString(); names = names + "\r\n" + work; mrk = mrk + "\r\n" + work2; sw.Write("<tr><td>"); sw.Write(work); sw.Write("</td><td>"); sw.Write("\r\n" + work2); sw.Write("</td></tr>"); } sw.Write("</table>");

これを実行すると

あ い う え
A ○
A ◆
A ×
B ○
B ◆
B △
と表示されます

これを

あ い う え
A ○ ◆ ×
B ○ ◆ △

のように一列にしたい場合なにをしたらいいのでしょうか

また○や◆は値の結果によって記号が変わるSQLです

まだプログラム初心者で質問していることがよくわからないかもですがよろしくおねがいいたします

お願いします

追記
データA,Bは必ず要素が3つというわけではありません
要素は4種類あって、○◆の2つだけだったり×も含めた3つだったりします
並んではいっているデータというのかわかりませんが
データベースには
name mark ←テーブル名
A ○
A ×
A ◆
B ○
B ×
C ○
C ◆
C △

という具合にデータが入っています

わかりにくい説明で申し訳ありません…

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

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

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

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

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

tamoto

2016/08/04 03:57

一つ確認です。表にしたいデータA,B,...は、必ず3要素ずつ入っていて、かつ並んで入っているデータで間違いないですか?
guest

回答2

0

質問内容を多分に深読みして回答してみます。

「markの種類と個数は最初から決まっている」
「決まった列には決まった記号を出力したい(例えば:"あ"の列には"○")」
「記号が存在しない部分には空白を入れたい」

という前提の上でコーディングしてみました。
もし質問の意図を正しく把握できていなかった場合は申し訳ないですが無視して下さい。

csharp

1var rows = table.Rows.OfType<DataRow>() // DataRow型のデータをソースとする 2 .GroupBy( 3 row => row["name"].ToString(), // "name" でデータを分類 4 row => row["mark"].ToString(), // "mark" で記号データを取得 5 (name, marks) => new 6 { 7 name, 8 marks = new[] { "○", "◆", "×", "△" }.Select(mark => marks.Contains(mark) ? mark : string.Empty) // "○◆×△"の順で記号の存在判定、存在しない場合は"" 9 }); 10 11// 以下出力 12foreach (var row in rows) 13{ 14 sw.Write("<tr>"); 15 sw.Write("<td>" + row.name + "</td>"); 16 foreach (var mark in row.marks) 17 sw.Write("<td>" + mark + "</td>"); 18 sw.Write("</tr>"); 19}

コードの内容はコメントの通りですが、
最初に(name, mark) のデータをnameで分類して、
その後markが存在するかどうかで記号か空白に分けて配列にし、
最後に二重foreachで出力しています。
データ部のみを出力しているので、ヘッダー部や<table>などは別途出力して下さい。

もう少し仕様や制約に関する情報があれば、もっと効率的なコードが書けると思います。

投稿2016/08/04 06:30

編集2016/08/04 06:59
tamoto

総合スコア4103

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

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

pro-poke5

2016/08/04 08:26

丁寧な回答ありがとうございました お2人方ベストアンサーにしたかったのですが、、、すみません
guest

0

ベストアンサー

ループを入れ子にすればいいと思います。

まず

<tr><th>A</th>

を出力し、
そのあと

<td>あの値</td>

から

<td>えの値</td>

までをループで出力するのを1ブロックとして、

</tr>

で閉じる。

この1行分を、さらにB,Cと順にループします。

【追記】

>記号の入るいちの分岐させる文、

記号が○だからどこそこの位置に入れる、の考え方をいったん忘れてください。
(そういうやり方もありますが今の理解度では難しい気がするので)

<td>ループの1回目なら、今から入れようとしている位置が「あ」だから、 mrkが「○かどうか」を判定して「入れるか入れないか」決める <td>ループの2回目なら、今から入れようとしている位置が「い」だから、 mrkが「◆かどうか」を判定して「入れるか入れないか」決める

という考え方です。

>AやBの記号を1列に表示させる文

これは最初の説明のとおりです。
1行の内容はこれですね

<tr> <th>A</th> <td>○</td> <td>◆</td> <td></td> <td>×</td> </tr>

この塊を、A,B,C・・・とループしたいわけなので、
1周めで何をするか?

最初に

<tr> <th>A</th>

を出力する。
次に

<td>(上記で説明した、ここに何か入れるor入れない処理を行う)</td>

を「あ」~「え」までループする。
最後に

</tr>

を出力する。
これを、2周目はB、3周目はC、と繰り返すループになります。

もし難しければ、最初はHTMLのタグだけを出力するループを作ってみてください。
それでテーブルのソースができたら、中に記号を入れる処理を追加してください。
一度に全部やろうとすると、どこがうまくいっていないのか自分でもわからなくなるでしょう。

投稿2016/08/04 02:18

編集2016/08/04 04:53
NatsumiOki

総合スコア1298

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

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

pro-poke5

2016/08/04 02:36 編集

回答ありがとうございます ◆や×はすべて mrk で変数であり ○だったら、あ の枠(箱)で◆だったら、い のところに入れたいです foreach分の中で分岐条件を書くべきと言われたのですが、その場合はどうしたらよいでしょうか? たびたびすみません…。 よろしくおねがいします
NatsumiOki

2016/08/04 02:44

すみません、回答で「あ」~「え」までループとしていましたが、Aが入る列が「あ」だったんですね。入れ子の中のループは「い」~「え」ですね。 だとしても処理の流れは同じことだと思いますが… 表を作るのですから中身がなんであれ、1行の中で「い」~「え」まで<td>を繰り返すことになります。 「い」の<td>を出力する時点で、「記号が○かどうか」の条件分岐で値を入れるかどうかを判定したらよいのではないでしょうか。
pro-poke5

2016/08/04 03:23

すみません、やってみたのですがやはりできませんでした… また質問の現在の実行結果に誤りがありましたので修正しました またスペースを入れたのですが、なぜかずれてしまっていまして、AやBの入る列は空白で記号が入る列が「あ」や「い」で大丈夫です。 記号の入るいちの分岐させる文、 AやBの記号を1列に表示させる文 swich文などで分岐させたいのですが、、、 すみません…
NatsumiOki

2016/08/04 04:45

長くなりますので回答に追記しますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問