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

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

ただいまの
回答率

90.52%

  • C#

    7091questions

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

  • CSV

    632questions

    CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

クラスの中に他のクラスのデータをもってきたい。

解決済

回答 3

投稿 編集

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

xlostdjx

score 25

実現したいこと。
connectionDb.cs のpublic void CSV_OutputData(SaveFileDialog result)
にStockList.csのDataGridViewのデータをもってきたいです。
ご教授お願いします。

StockList.cs 

using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Configuration;
using Oracle.DataAccess.Client;

namespace StockList
{
    public partial class StockListForm : Form
    {
        public StockListForm()
        {
            InitializeComponent();
        }
          // DataTableを作成 
            DataTable DT = new DataTable();
            OracleConnection Connect = new OracleConnection();

            // 接続文字列の設定
            string ConnectionString = ConfigurationManager.ConnectionStrings["OracleDB"].ConnectionString;
            Connect.ConnectionString = ConnectionString;
            try
            {
                // DB接続する
                Connect.Open();
                // 一覧取得用SQL文を作成
                StringBuilder SQL = new StringBuilder();
                // inner join 指定した2つのカラムに基づく同じデータを合わせる。
                // ORDER BY   指定したカラムのソート順でグループ枠で並び替える。 
                // WHERE      条件を指定して検索する    
                SQL.AppendLine("SELECT");
                SQL.AppendLine(" TS.tana_cd,");
                SQL.AppendLine(" MT.tana_nm,");
                SQL.AppendLine(" TS.item_cd,");
                SQL.AppendLine(" MI.item_nm,");
                SQL.AppendLine(" TS.in_out_date,");
                SQL.AppendLine(" TS.in_out_type,");
                SQL.AppendLine(" TS.in_out_quantity,");
                SQL.AppendLine(" TS.QUANTITY,");
                SQL.AppendLine(" MI.unit_name,");
                SQL.AppendLine("TS.memo");
                SQL.AppendLine("FROM t_stock TS");
                SQL.AppendLine(" inner join m_tana MT");
                SQL.AppendLine(" on TS.tana_cd = MT.tana_cd");
                SQL.AppendLine(" inner join m_item MI");
                SQL.AppendLine(" on TS.item_cd = MI.item_cd");
                SQL.AppendLine("WHERE");
                // WHERE ◯ = ◯ が等しければすべての条件が 「true」になる
                SQL.AppendLine("0 = 0");
                // !を先頭につけてtrueとfalseを入れ替える事もできる。例 if (!string.IsNullOrEmpty(RackCode.Text)                                  
                SQL.AppendLine(" and TS.in_out_date BETWEEN " + "'" + InOutFromDate.Value.ToString("yyyy/MM/dd") + "'");
                SQL.AppendLine(" and" + "'" + InOutToDate.Value.ToString("yyyy/MM/dd") + "'");
                if (string.IsNullOrEmpty(RackCode.Text) == false)
                {
                    SQL.AppendLine("and TS.tana_cd = " + "'" + RackCode.Text + "'");
                }
                if (string.IsNullOrEmpty(ItemCode.Text) == false)
                {
                    SQL.AppendLine(" and TS.item_cd = " + "'" + ItemCode.Text + "'");
                }
                if (InOutType.SelectedIndex != 0)
                {
                    SQL.AppendLine(" and TS.in_out_type = " + "'" + InOutType.SelectedIndex + "'");
                }
                SQL.AppendLine("ORDER BY");
                SQL.AppendLine(" TS.tana_cd,");
                SQL.AppendLine(" TS.item_cd,");
                SQL.AppendLine(" TS.in_out_date,");
                SQL.AppendLine(" TS.in_out_type");
                // テーブルソースからデータを取得する
                var DA = new OracleDataAdapter(SQL.ToString(), Connect);
                // SQL文の結果をDaTaTableに格納する 
                DA.Fill(DT);
                // DataGridViewにDataTableをセット
                DataGrid.DataSource = DT;
                // DB接続解除 
                Connect.Close();

                // DataGridの行数の取得                   
                int LineCount = (DataGrid.BindingContext[DataGrid.DataSource, DataGrid.DataMember].Count);
                // 3桁区切り制御
                string Delimitern = String.Format("{0:#,##0} ", LineCount);
                // データ件数に表示
                DataCount.Text = Delimitern;
            }
            // Exception(Oracle Ver.) アプリの実行中に起きるエラーを表す
            catch (OracleException ex)
            {
                // エラーが起きたときにエラーメッセージとスタックトレースを表示させる。(覚えておく)
                string trace = Environment.StackTrace;
                MessageBox.Show("エラーが起きました!" + trace);
            }
        }

connectionDb.cs 

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace StockList
{
 public class OutputFile
    {
        /// <summary>
        /// SCVダイアログ
        /// </summary>
        public void CSV_Output()
        {
            // SaveFileDialogを作成する          
            SaveFileDialog result = new SaveFileDialog();
            result.Title = "ファイルを保存する";
            // 初期表示時のディレクトリを指定
            result.InitialDirectory = @"C:\Users\Admin\Downloads";
            // ファイル名を指定し取得する
            result.FileName = @"ForOutput.csv";
            // 選択できるファイルの種類を指定する
            result.Filter = "CSV (カンマ区切り)|*.csv";
            // ファイル出力(保存)ダイアログ表示 
            DialogResult FileOutput = result.ShowDialog();

            // //「保存」ボタンが押された時の処理
            if (FileOutput == DialogResult.OK)
            {
                //指定されたファイルのパスを取得する
                string fileName = result.FileName;
            }
            else if (FileOutput == DialogResult.Cancel)
            {
                //「キャンセル」ボタンまたは「×」ボタンが選択された時の処理
                return;
            }
            // CSV出力
            CSV_OutputData(result);
        }
        /// <summary>
        /// CSV出力
        /// </summary>
ここの関数        public void CSV_OutputData(SaveFileDialog result)
        {

            //ここにDataGridViewのデータを持っていきたい


            // 保存用のファイルを開く                            ( ファイルパス)( ファイル名 )              (文字コード指定)
            using (StreamWriter writer = new StreamWriter(result.FileName, false, Encoding.GetEncoding("shift_jis")))
            {

connectionDb.csの DataGridViewのデータを持っていきたい   

                // リストの初期化
                List<String> strList;
                strList = new List<String>();
                //DataGridViewの列を取得
                int rowCount = DG.Rows.Count;

                // ヘッダ部の出力
                // Columns.Count カルム数ループ
                for (int j = 0; j < DG.Columns.Count; j++)
                {
                    // カラムのヘッダのテキストをリストに追加
                    strList.Add(DG.Columns[j].HeaderCell.Value.ToString());
                }
                // 配列へ変換
                String[] strArray = strList.ToArray();
                // CSV 形式に変換             // カンマ区切り 
                String strCsvData = String.Join(",", strArray);
                //ヘッダを出力
                writer.WriteLine(strCsvData);

                // データ部の出力
                // rowCount 行数文ループ
                for (int i = 0; i < rowCount; i++)
                {
                    // リストの初期化
                    strList = new List<String>();
                    // Columns.Count カルムの数だけループする
                    for (int j = 0; j < DG.Columns.Count; j++)
                    {
                        // 列と行のテキストをリストに追加 (FormattedValueで書式設定済みのセルの値を取得)
                        strList.Add(DG[j, i].FormattedValue.ToString());
                    }
                    // 配列へ変換             
                    String[] stgArray = strList.ToArray();
                    // CSV 形式に変換             // カンマ区切り
                    String stgCsvData = String.Join(",", stgArray);
                    //列と行を出力
                    writer.WriteLine(stgCsvData);
                }
            }
        }
    }
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • papinianus

    2018/06/28 10:42

    何を持ってきたいのですか?おそれいりますが、そもそもなぜクラスをわけることにしたのかの経緯を伺ってもよろしいですか?(connectionDBという名前なのにDBにコネクションしないのはやめたほうがいいと思います)

    キャンセル

  • xlostdjx

    2018/06/28 11:56 編集

    編集したのでご確認お願いします。 クラスを分けるのは見やすく(読みやすく)するためです。 connectionDBという名前の指摘もあとで修正します。

    キャンセル

回答 3

checkベストアンサー

+1

    public partial class StockListForm : Form
    {
        public StockListForm()
        {
            InitializeComponent();
        }

        OutputFile ofile = new OutputFile();

        /// <summary>
        /// CSV出力ボタン押下時
        /// </summary>
        public void CSV_Output_Click(object sender, EventArgs e)
        {
            //string filename = System.String.Empty;

            ofile.なんやらかんやら      
        }


当然のことながら、使用するクラス、変数、関数はpublicをつけるように


    public partial class StockListForm : Form
    {
        public StockListForm()
        {
            InitializeComponent();

            ofile.dtgrid = datagridview1;
        }


        OutputFile ofile = new OutputFile();

----------------------------------------------------

 public class OutputFile
    {
      public dtgrid:DataGridView;


        /// <summary>
        /// CSV出力
        /// </summary>
       public void CSV_OutputData(SaveFileDialog result)
        {

            //ここにDataGridViewのデータを持っていきたい
            dtgrid.なんやかや


DataGridViewそのものを渡さなくても、なんかデータ格納用のクラスを作って渡してもOK

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/28 12:04

    少し詳しく編集を加えたのでご確認お願いします。

    キャンセル

  • 2018/06/28 13:31

    ofile.dtgrid = datagridview1; が理解できないのですが、
    実装してもエラーがでます。

    キャンセル

  • 2018/06/28 13:33

    それはFormにおいてるDataGridViewの名前です。
    あなたの環境に合うように修正しましょう

    キャンセル

  • 2018/06/28 13:43

    opfile.data = DataGrid;
    自作でしてもエラーがでます。

    opfileにdataの定義が含まれていないとなるのですが、、

    キャンセル

  • 2018/06/28 13:54

    回答の追記のソースをよく見てください

    public class OutputFile
    {
    public dtgrid:DataGridView;
    これを追記してください

    キャンセル

+1

回答ではないですが。
あとからこの質問を見た人向けに注意喚起のためにコメントします。

if (string.IsNullOrEmpty(RackCode.Text) == false)
{
    SQL.AppendLine("and TS.tana_cd = " + "'" + RackCode.Text + "'");
}
if (string.IsNullOrEmpty(ItemCode.Text) == false)
{
    SQL.AppendLine(" and TS.item_cd = " + "'" + ItemCode.Text + "'");
}
if (InOutType.SelectedIndex != 0)
{
    SQL.AppendLine(" and TS.in_out_type = " + "'" + InOutType.SelectedIndex + "'");
}


質問文のソースコードはSQLインジェクションが発生するコードです。
SqlParameter クラスを使用してくださいな。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

前提として、CSV_Output()は、StockList.csのButton1_onclick()とかで呼び出すという風に理解しています。

こういう構造が正しいかはともかく

//public void CSV_Output() //←この部分を↓
public void CSV_Output(DataGrid DG)
//ここの関数        public void CSV_OutputData(SaveFileDialog result) //←この部分を↓
public void CSV_OutputData(SaveFileDialog result, DataGrid DG)


としておいて、CSV_Outputの下のほうの
CSV_OutputData(result);CSV_OutputData(result, DG);にするともっていけるとは思います。
(StockList.csでCSV_Output();となっているところは、CSV_Output(Datagrid);とかにする必要があります)

--余談
読み易く、とのことですが、どういう観点で読み易いのでしょうか。「持ってくる」ということをすれば(それができたとして)、持ってこられたものの内容(Datagrid)、それがどこからどういう姿で持ってこられているかなどは、StockList側にあるわけで、別人があるいは時間をおいてから読み易いのかな?と感じました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    C#のDataGridView

    C#のDataGridViewはRow, Column, Cellのような構造をもっていますが、複雑でわかりにくいです。 3行目、4列目のセルの種類(buttonとかstri

  • 解決済

    C# DataGridViewについて

    前提・実現したいこと C#で「ボタンをクリックすると、XMLの内容をDataGridView」に表示するプログラムを作りました。 しかし、ボタンを何回もクリックすると、XM

  • 解決済

    ローカル .mdf ファイルから DataGridViewをバインドする方法。

    さきほど 解決していただいてありがとうざいます。 今度はローカルの .mdfファイルから DataGridViewをバインドさせたいのですが… visualstud

  • 解決済

    dataGridViewを使った検索機能について

    お世話になっております。 パスワード管理するシステムの検索機能を実装しているのですが、 検索ボタンを押したときにdataGridView内に同じデータが、検索ボタンを押下し

  • 解決済

    C# DatagridViewの使い方

    C# DataGridViewについて 1列目の1行目にA、2行目にB、3行目にCと表示したくて下記のようにコーディングしました。 namespace WindowsF

  • 解決済

    VB.NETでデータを保持したい

    Visual Studioを使いVB.NETでウィンドウズアプリケーションを作成しています。 DataGridViewを配置し、CSVを開きそのデータをDataGridView

  • 解決済

    DataGridViewのイベント

    Form1の画面にDataGridViewを貼りつけ、DataGridViewのカラムを3つ追加します。 カラム1のColumn TypeはDataGridView TextB

  • 解決済

    Classの変数の数を可変にする方法について

    いつもお世話になっております。 以下の内容について、皆様のお知恵をお借りしたく、宜しくお願いします。 前提・実現したいこと 現在Visual Studio 2015を使用し、x

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

  • C#

    7091questions

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

  • CSV

    632questions

    CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。