🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Visual Studio

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

Q&A

解決済

1回答

2408閲覧

ボタンクリックイベント時にgrdListに表示されたセルを抽出したい

y.u

総合スコア8

C#

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

Visual Studio

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

0グッド

1クリップ

投稿2019/10/24 09:08

編集2019/10/24 13:07

前提・実現したいこと

ボタンをクリックした際にgridviewに表示された表から選択した行(複数可)の内容をCSVに出力したい。

発生している問題・エラーメッセージ

1.Button1_Clickのイベントを起こした際にgrid内の選択されているセルを抜き出すという動作を行うことができない。
2.抜き出したセルの内容をstreamwriterに出力する部分に一部不具合がある

該当のソースコード

//load時にgrdListにSQLを表示
private void Form1_Load(object sender, EventArgs e)
{
MySqlConnection MySQLcn;
string sSQL = string.Empty;
try
{
MySQLcn = new MySqlConnection(ConfigurationManager.ConnectionStrings["mysql"].ConnectionString);
MySQLcn.Open();

        //ここにSQL文が入る

MySqlDataAdapter da = new MySqlDataAdapter(sSQL, MySQLcn); DataTable dt = new DataTable(); da.Fill(dt); grdList.DataSource = dt; //gridviewを最大化する grdList.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; grdList.SelectionMode = DataGridViewSelectionMode.FullRowSelect; //DataGridView1のセルを読み取り専用にする grdList.ReadOnly = true; MySQLcn.Close(); } catch { MessageBox.Show("データ読み込みに失敗しました。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } }

private void Button1_Click(object sender, EventArgs e)
{
//1:ここでgrid内で選択したセルを持っていきたい
}

//csvへの書き込み
using (StreamWriter sw = new StreamWriter(@"\出力test.csv", false,System.Text.Encoding.GetEncoding("shift_jis")))
{
while (セルの中身)
{

string row = string.Empty;

          //今回行数は15
for (int i = 0; i < 15; i++)
{
row[i] = (セルの中身.IsDBNull(i)) ) ? "" : reader.GetString(i).ToString();

if (0 == i) { row += (セルの中身.IsDBNull(i)) ? "" : reader.GetString(i).ToString(); } else { row += (セルの中身.IsDBNull(i)) ? "," : "," + reader.GetString(i).ToString(); } } sw.WriteLine(row); } }
### 試したこと ### 補足情報(FW/ツールのバージョンなど) visualstudio2019  WindowsForms .NET framework4.7.2

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

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

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

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

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

y_waiwai

2019/10/24 09:11

ちとコードが見づらいので、質問を編集し、<code>ボタン、出てきた’’’の枠の中にコードを貼り付けてください
y.u

2019/10/24 12:05

申し訳ございません。修正いたしました
Zuishin

2019/10/24 12:21

不具合以前に疑似コードですよねこれ。
退会済みユーザー

退会済みユーザー

2019/10/24 12:25 編集

何を作っているのですか? ASP.NET Web Forms? Windows Forms? その他? gridview とは何ですか? 開発環境(OS, .NET のバージョンなど)ぐらいは書けませんか?
guest

回答1

0

ベストアンサー

あまり一度にしてはいけません。プログラミングの基本は小さな機能に分割することです。
あなたがやるべきことは、

  1. DataGridView からデータを取り出す
  2. データを CSV に成形する
  3. データをファイルに書き出す

以上の三つです。これをすべて同時に行うと、不具合がどこで起きているのか非常にわかりにくくなります。
したがって、確実に動作するよう一つずつ作っていきましょう。
まずはデータを取り出し、Debug.WriteLine で出力ウィンドウに出力して動作を確かめるもの、次にデータを CSV に成形して出力するもの、最後にそれをファイルに書き出すものです。

しかし、今回に限ってはもっと簡単な道があります。

C#

1var dataObject = dataGridView1.GetClipboardContent(); 2var csv = dataObject.GetText(TextDataFormat.CommaSeparatedValue); 3Debug.WriteLine(csv);

ボタンを押すと上記コードが動くようにし、適当なセルを選択して動かしてみてください。CSV に成形された状態で出力されると思います。
DataGridView には、選択されたセルの中身を CSV として取り出す機能が内蔵されているのです。これは主にクリップボードにコピーする時に使うよう想定され、GetClipboardContent という名前になっています。

このメソッドによって取り出された DataObject 型のデータは、様々な形でデータを取り出せるようになっています。そのうち、TextDataFormat.CommaSeparatedValue を指定して取り出したデータは CSV になります。

これをファイルに書き込んでください。ファイルへの書き込みは、File.WriteAllText を使うと楽です。

投稿2019/10/24 13:26

編集2019/10/24 13:28
Zuishin

総合スコア28669

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

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

y.u

2019/10/25 00:23

ありがとうございます!解決できました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問