C# CSVファイルの保存がしたいです。

Category: visual studio cs_ja

Question

kinto-to-clave on Fri, 10 Aug 2018 02:54:50


C#で dataGridView にある値を保存ボタンを押したときダイアログボックス表示で名前と保存先を指定し保存したいです。

検索では沢山ヒットするのですがエラーが出たりうまく行きません C#初心者である今私にはそれの理由を解読することが出来ずにいます。一番近いと思う例が見つかったので試してみたのですが 2行だけエラーが出ます。まずこれの理由と解決方法が知りたいです。コードとエラーの行を下記に書きます。

①は プロパティまたはインデクサー "FileDialog.CustomPlaces" は読み取り専用であるため、割り当てることは出来ません。

②は 型System.Windows.Forms.DialogResult を ’bool?’ に暗黙的に変換出来ません。

と言われます。

もしこれが解決して動いた場合 ③ の部分で dataGridViewの値をエイヤで書いています、エラーが出ないので何かしら動くと思っていますが本来の目的は dataGridView の指定した値を法則通りにCSVファイルに格納したいです。

最終的には読み出しと値の取り込みですがまずこちらを解決したいです。

どうか何卒宜しくお願い致します

using System;

using System.Text;

using System.Windows;

using Microsoft.Win32;

using System.IO;

参考にしているプログラムの冒頭部分

namespace trial_saveas
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

私のプログラムの冒頭部分namespace Slial_test_1_DEBUG
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

        }

この違いも影響が原因があるのでしょうか?


private void save_Click(object sender, EventArgs e)

        {
            //WriteCsv();
            SaveFileDialog dlg = new SaveFileDialog();
            dlg.AddExtension = true; // ユーザーが拡張子を省略したときに、自動的に拡張子を付けるか。規定値はtrue。
            dlg.CheckFileExists = false; // ユーザーが存在しないファイルを指定したときに、警告するか。規定値はfalse。
            dlg.CheckPathExists = true; // ユーザーが存在しないパスを指定したときに、警告するか。規定値はtrue。
            dlg.CreatePrompt = false; // ユーザーが存在しないファイルを指定したときに、作成の許可を求めるか。規定値はfalse。

            ① → dlg.CustomPlaces = null; // ダイアログ左側のショートカットのリスト。

            dlg.DefaultExt = string.Empty; // ダイアログに表示するファイルの拡張子。規定値はEmpty。
            dlg.DereferenceLinks = false; // ショートカットが参照先を返す場合はtrue。リンクファイルを返す場合はfalse。規定値はfalse。
            dlg.FileName = string.Empty; // 選択されたファイルのフルパス。
            dlg.Filter = string.Empty; // ダイアログで表示するファイルの種類のフィルタを指定する文字列。
            dlg.FilterIndex = 1; // 選択されたFilterのインデックス。規定値は1。
            dlg.InitialDirectory = @"c:\"; // ダイアログの初期ディレクトリ。規定値はEmpty。
            dlg.OverwritePrompt = true; // 存在するファイルを指定したときに、警告するか。規定値はtrue。
            dlg.Title = "保存するファイル名を入力してください。"; // ダイアログのタイトル。
            dlg.ValidateNames = true; // ファイル名がWin32に適合するか検査するかどうか。規定値はfalse。

            ② → bool? result = dlg.ShowDialog();

            if (result == true)
            {
                string filename = dlg.FileName;
                Encoding enc = Encoding.GetEncoding("shift_jis");
                try
                {
                    ③ → File.WriteAllText(filename, dataGridView1.Text, enc);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    return;
                }
            }
        }

Replies

uemu on Fri, 10 Aug 2018 04:38:38


① 読んで字の如く読み取り専用ですので、値を設定することは出来ません。
   使用しないのであれば、値を設定する必要もありません。
   https://msdn.microsoft.com/ja-jp/library/system.windows.forms.filedialog.customplaces(v=vs.110).aspx

② ShowDialogの戻り値はDialogResult型でbool型ではありません。また、DialogResult型は暗黙的にboolに変換できません。
   resultをDialogResult型で定義してください。
   https://msdn.microsoft.com/ja-jp/library/c7ykbedk(v=vs.110).aspx

エラーが発生したがエラー内容がわからない場合は、エラー文字列なりなんなりで検索を行えば、
エラーとなる理由くらいはすぐにわかるかと思います。


trapemiya on Fri, 10 Aug 2018 04:42:41


①に関してはエラーメッセージの通りですが、CustomPlacesプロパティは読み取り専用です。よって、コードで値を設定することはできません。
プロパティには読み取りも書き込みもできるものと、読み取りしかできないものがあります。書き込みしかできないものは通常はありません(コンパイルはできます)。MSDNで確認すると、以下のようになっています。

上記のページから引用
[BrowsableAttribute(false)]
public FileDialogCustomPlacesCollection CustomPlaces { get; }

getしかありませんので、読み取りしかできないことになります。setがあれば書き込みも可能なプロパティということになります。

②に関してもエラーメッセージ通りです。ShowDialogメソッドの戻り値はDialogResult型なので、bool?の代わりにDialogResultとして下さい。

>型System.Windows.Forms.DialogResult を ’bool?’ に暗黙的に変換出来ません。

上記の意味は、DialogResult で受け取ってほしいんだけど、bool?で受け取るようになっているからbool?に変換(キャスト)したいんだけど、それができないという意味です。

③に関してですが、おそらくそれでは実現できません。どのようになるのかも経験ですから、一度、そのコードでテストしてみて下さい。
さて、DataGridViewの内容をCSVで吐き出すには、「datagridview csv」でネットを検索すると見つかると思います。例えば私が検索してみましたが、以下などが見つかりました。

[ VB.NET / C# ] データグリッドビューのデータを CSV ファイルへ出力する
http://hensa40.cutegirl.jp/archives/760


★良い回答には質問者は回答済みマークを、閲覧者は投票を!

SurferOnWww on Fri, 10 Aug 2018 04:49:12


DataGridView ということは質問者さんが作ろうとしているのは Windows Forms アプリですか?

でも、using System.Windows; とか public partial class MainWindow : Window とか WPF アプリのようでもあるし、やってることがメチャクチャという気がするのですか?

まずは、質問者さんが何を作っているかと(Windows Forms? WPF? その他?)、開発環境(OS, .NET, Visual Studio のバージョンなど)を明確にしてください。

すでに回答が出ていますが、回答されている方はそのあたりが明確なのでしょうか? 実は WPF とか言うことだと話が噛み合わなくなるのでは?

Hongliang on Fri, 10 Aug 2018 04:57:26


DataGridView ということは質問者さんが作ろうとしているのは Windows Forms アプリですか?

でも、using System.Windows; とか public partial class MainWindow : Window とか WPF アプリのようでもあるし、やってることがメチャクチャという気がするのですか?

質問文を読めばわかりますが、WPFのサンプルコードをWinFormにそのまま持ってきて、同名別クラスの差異にはまっている状況ですよ。

trapemiya on Fri, 10 Aug 2018 05:50:27


Hongliangさんのおっしゃる通りですね。
見落としており、WPFのサンプルコードを持ってきていることに気づいていませんでした。すみません。

このままWPFのサンプルコードを使うのであれば、
(new Microsoft.Win32.SaveFileDialog()).ShowDialog()
としてしまえば良いですが、明らかにミスリードだと思いますので、WPFではなくWindowsフォームのSaveFileDialogのサンプルコードをご紹介しておきます。

「名前を付けて保存」ダイアログボックスを表示する
https://dobon.net/vb/dotnet/form/savefiledialog.html

SurferOnWwwさんも、ご指摘ありがとうございました。

#kinto-to-claveさんへ

デスクトップアプリケーションの作成に関し、古くから使われているWindows Formの技術に加え、現在ではWindows Formより高機能なWPFという技術があります。サンプルコードは共通で使えるものもあれば、そうでないものもあります。kinto-to-claveさんはWindows Formで開発されていますので、Windows Formのサンプルコードを探して下さい。

以下は今の時点では聞き流してもらってかまいませんが、参考のために書いておきます。
Windows FormとWPFは共存できます。昔のWindows FormアプリケーションにWPFで開発した画面を追加することは可能です。実際、私も昔開発されたWindows Formアプリケーションを全面改修するには工数が大きすぎる場合、このようなことをよく行います。逆にWPFからWindows Formの画面を呼ぶこともできますが、通常はこのようなことはありません。なぜならWindows FormはWPFより前の技術であり、WPFに比べて見劣りするからです。
このように私は新規開発はもちろん、Windows Formにおける追加の新規開発でもWPFを用います。
kinto-to-claveさんはWindows FormとWPFの違いがよくわかられていませんし、上のことからも新規に開発するのであれば、WPFでの開発をされたらなぁと思います。実際のところ、私もなぜWindows Formでの新規開発なんだろう? 初心者と言われていたのでそのためかな?と思っておりました。
WPFもWindows Formとほぼ同じ感覚で開発できます。ただ、WPFはWindows Formよりも高機能なので、WPFを使いこなすにはWindows Form以上に勉強が必要になります。ただ、高機能な部分を使わなければその勉強は必須ではありません。少しずつ勉強されていけば良いと思います。


★良い回答には質問者は回答済みマークを、閲覧者は投票を!


uemu on Fri, 10 Aug 2018 05:59:16


同じく見落としてました。失礼しました。


kinto-to-clave on Fri, 10 Aug 2018 06:05:08


検索はするのですがその先を理解することが今はまったくと言っていいほどわからずにいます。地道に勉強します。

ありがとうございました。

SurferOnWww on Fri, 10 Aug 2018 06:26:49


> 検索はするのですがその先を理解することが今はまったくと言っていいほどわからずにいます。

C# 初心者ということだそうですので、そこはやむを得ないとは思いますが・・・

先にもお願いしたように、質問の一行目に質問者さんが何を作っているかと(Windows Forms? WPF? その他?)、開発環境(OS, .NET, Visual Studio のバージョンなど)を書いてください。

結局、上のお願いはスルーですか?

kinto-to-clave on Fri, 10 Aug 2018 06:42:17


いえ今みなさんのやり取りに気が付いたところです。

今更ですが C# Windows Forms Visual Studio Cmmunity 2017 Version 15.7.2 です。

皆様ありがとうございます。よく読んで整理してみます。

kinto-to-clave on Fri, 10 Aug 2018 06:59:18


丁寧に教えて下さって誠にありがとうございます。WPFは知りませんでした。早速確認してみます。元々ハードとマイコンの組み込みでスタンドアロンの開発機器を手掛けていました。PCアプリとセットの場合は外注さんにお願いしてきました。ほとんどC#でした。いろいろと事情がありなるべく全部自分でやらなくてはならなくなってきたのですがクラスの概念や記述のルールなどいったい何がダメでどう検索すればいいのかに日々頭を抱えています。あまり質問ばかりではよくないと思いながらも自力での検索では生産性が恐ろしいほど悪く結局質問に甘んじています。ですが少しづつ動くものが出来てきました。コツコツとやっていきたいと思います。 こちらの方へのお返事となりましたが皆さま大変ありがとうございました。 一方的ではありますが今後とも何卒宜しくお願い致します。少しづつ質問の質を上げていければと思っています。