/// <summary>
        /// その悪魔を作るためにどんな合体で作れるか一覧を作る関数
        /// (結果が選択した悪魔)
        /// </summary>
        public DataTable SearchDevilUnion(string DevilName, string DevileTribe, int Grade, int Rare)
        {
            // 選択した悪魔の種族が作成可能な種族を取得
            string query = QueryCreate.CreateGetUnionTribe(DevileTribe);

            DA.DataAccess da          = new DA.DataAccess();
            DataTable     dtTribeInfo = new DataTable();

            dtTribeInfo = da.readdata(query);
            DataTable dtBaseInfo  = new DataTable();
            DataTable dtAddInfo   = new DataTable();
            DataTable dtAfterInfo = new DataTable();
            // この行はいらないかも。
            DevilTable dvlTbl = DevilTable.GetInstance();
            // 画面に表示する悪魔データの格納場所
            DataTable dtUnionList = new DataTable();

            dtUnionList.Columns.Add("グレード1", Type.GetType("System.Int32"));
            dtUnionList.Columns.Add("レア度1", Type.GetType("System.Int32"));
            dtUnionList.Columns.Add("種族1", Type.GetType("System.String"));
            dtUnionList.Columns.Add("悪魔名1", Type.GetType("System.String"));
            dtUnionList.Columns.Add("x", Type.GetType("System.String"));
            dtUnionList.Columns.Add("グレード2", Type.GetType("System.Int32"));
            dtUnionList.Columns.Add("レア度2", Type.GetType("System.Int32"));
            dtUnionList.Columns.Add("種族2", Type.GetType("System.String"));
            dtUnionList.Columns.Add("悪魔名2", Type.GetType("System.String"));

            foreach (DataRow inforow in dtTribeInfo.Rows)
            {
                int    i, j, k;
                string namebase = inforow["DevilBase"].ToString();
                string nameAdd  = inforow["DevilAdd"].ToString();
                int    minGrade = 0;
                int    maxGrade = 0;

                //dvlTableから対象となる種族の悪魔情報を全件取得する。
                // 素材1のデータ
                query      = QueryCreate.CreateGetDevilTableUnionInfo(namebase);
                dtBaseInfo = da.readdata(query);

                // 素材2のデータ
                query     = QueryCreate.CreateGetDevilTableUnionInfo(nameAdd);
                dtAddInfo = da.readdata(query);

                // ユーザーが選択した種族のデータ
                //query = QueryCreate.CreateGetDevilTableUnionInfo(DevileTribe);
                query       = QueryCreate.CreateGetDevilTableUnionInfoUserSelect(DevileTribe);
                dtAfterInfo = da.readdata(query);

                // 選択された悪魔が含まれていない(合体不可な悪魔)場合は処理を終了する。
                for (i = 0; i < dtAfterInfo.Rows.Count; i++)
                {
                    if (dtAfterInfo.Rows[i]["Name"].ToString() == DevilName)
                    {
                        break;
                    }
                }
                if (i == dtAfterInfo.Rows.Count)
                {
                    return(dtUnionList);
                }

                /*
                 * 計算した結果のグレード値が、対象種族の悪魔のどの悪魔になるのか調べる。
                 * afterInfoのGrad1<渡されたGrade<AfterInfoのgrade2の時、grade2の悪魔になる。
                 */
                for (i = 0; i < dtBaseInfo.Rows.Count; i++)
                {
                    int baseGrade = int.Parse(dtBaseInfo.Rows[i]["Grade"].ToString());
                    for (j = 0; j < dtAddInfo.Rows.Count; j++)
                    {
                        int AddGrade  = int.Parse(dtAddInfo.Rows[j]["Grade"].ToString());
                        int calcGrade = (int)(Math.Floor((double)((baseGrade + AddGrade) / 2))) + 1;
                        for (k = 0; k < dtAfterInfo.Rows.Count - 1; k++)
                        {
                            int afterGrade1 = int.Parse(dtAfterInfo.Rows[k]["Grade"].ToString());
                            int afterGrade2 = int.Parse(dtAfterInfo.Rows[k + 1]["Grade"].ToString());

                            if (k == 0)
                            {
                                minGrade = afterGrade1;
                                maxGrade = int.Parse(dtAfterInfo.Rows[dtAfterInfo.Rows.Count - 1]["Grade"].ToString());;
                            }

                            DataRow addListRow = dtUnionList.NewRow();

                            //}
                            if (afterGrade1 < calcGrade && afterGrade2 >= calcGrade)
                            {
                                // 計算したグレードが対象悪魔リストの現在行の値と次の行の値の間で
                                // 次のレコードのグレードと選択悪魔のグレードが同じなら作成できるパターン
                                if (afterGrade2 == Grade)
                                {
                                    addListRow["グレード1"] = int.Parse(dtBaseInfo.Rows[i]["Grade"].ToString());
                                    addListRow["レア度1"]  = int.Parse(dtBaseInfo.Rows[i]["Reality"].ToString());
                                    addListRow["種族1"]   = dtBaseInfo.Rows[i]["TribeName"].ToString();
                                    addListRow["悪魔名1"]  = dtBaseInfo.Rows[i]["Name"].ToString();
                                    addListRow["x"]     = "x";
                                    addListRow["グレード2"] = int.Parse(dtAddInfo.Rows[j]["Grade"].ToString());
                                    addListRow["レア度2"]  = int.Parse(dtAddInfo.Rows[j]["Reality"].ToString());
                                    addListRow["種族2"]   = dtAddInfo.Rows[j]["TribeName"].ToString();
                                    addListRow["悪魔名2"]  = dtAddInfo.Rows[j]["Name"].ToString();
                                    dtUnionList.Rows.Add(addListRow);
                                    continue;
                                }
                            }
                            else if ((afterGrade1 >= calcGrade) && (Grade >= calcGrade) && (Grade == minGrade))
                            {
                                // 計算したグレードが作成される悪魔のグレードより低く、かつ作成される悪魔の一番低いグレードと一致する場合、作成可能とする。
                                addListRow["グレード1"] = int.Parse(dtBaseInfo.Rows[i]["Grade"].ToString());
                                addListRow["レア度1"]  = int.Parse(dtBaseInfo.Rows[i]["Reality"].ToString());
                                addListRow["種族1"]   = dtBaseInfo.Rows[i]["TribeName"].ToString();
                                addListRow["悪魔名1"]  = dtBaseInfo.Rows[i]["Name"].ToString();
                                addListRow["x"]     = "x";
                                addListRow["グレード2"] = int.Parse(dtAddInfo.Rows[j]["Grade"].ToString());
                                addListRow["レア度2"]  = int.Parse(dtAddInfo.Rows[j]["Reality"].ToString());
                                addListRow["種族2"]   = dtAddInfo.Rows[j]["TribeName"].ToString();
                                addListRow["悪魔名2"]  = dtAddInfo.Rows[j]["Name"].ToString();
                                dtUnionList.Rows.Add(addListRow);
                                break;
                                //} else if ((afterGrade2 <= calcGrade) && (maxGrade < calcGrade) && (Grade < calcGrade) && (k == dtAfterInfo.Rows.Count - 1))
                            }
                            else if ((calcGrade > maxGrade) && calcGrade < afterGrade1 && afterGrade2 < calcGrade)
                            {
                                // 種族最大のグレードをもつ悪魔を計算したグレードが超えていたら、作成可能。
                                // 例、女神で最大グレードのラクシュミ(85)作成にヴィシュヌ(97)×アシェラト(83)でグレード91という計算になるが、作成可能。
                                // 個々を入れると最高ランクを作ったときの結果がおかしくなるっぽい。でも入れないと最小ランクの結果が出ない。どうしようか・・5/21
                                addListRow["グレード1"] = int.Parse(dtBaseInfo.Rows[i]["Grade"].ToString());
                                addListRow["レア度1"]  = int.Parse(dtBaseInfo.Rows[i]["Reality"].ToString());
                                addListRow["種族1"]   = dtBaseInfo.Rows[i]["TribeName"].ToString();
                                addListRow["悪魔名1"]  = dtBaseInfo.Rows[i]["Name"].ToString();
                                addListRow["x"]     = "x";
                                addListRow["グレード2"] = int.Parse(dtAddInfo.Rows[j]["Grade"].ToString());
                                addListRow["レア度2"]  = int.Parse(dtAddInfo.Rows[j]["Reality"].ToString());
                                addListRow["種族2"]   = dtAddInfo.Rows[j]["TribeName"].ToString();
                                addListRow["悪魔名2"]  = dtAddInfo.Rows[j]["Name"].ToString();
                                dtUnionList.Rows.Add(addListRow);
                                break;
                            }
                        }
                    }
                }
            }
            return(dtUnionList);
        }
        /// <summary>
        /// 指定された悪魔を使用した合体を全パターン検索する。
        /// </summary>
        /// <param name="DevilName"></param>
        /// <param name="DevileTribe"></param>
        /// <param name="Grade"></param>
        /// <param name="Rare"></param>
        /// <param name="Click"></param>
        /// <returns></returns>
        public DataTable SearchDevilMaterial(string DevilName, string DevileTribe, int Grade, int Rare)
        {
            //① deviluniontable.devliaddとdevilAfterに指定種族が含まれるパターンを列挙する。
            //② 列挙したら、指定悪魔と選択対象ではない種族の全悪魔との合体で何ができるか列挙して表示する。

            DataTable dtBaseInfo  = new DataTable();    // DevilUnionTableから選択種族ではない方の悪魔情報を格納する
            DataTable dtAddInfo   = new DataTable();    // DevilUnionTableのDevilAdd列情報
            DataTable dtAfterInfo = new DataTable();    // DevilUnionTableのDevilAfterに所属する悪魔をすべて格納する。
            int       minGrade    = 0;
            int       maxGrade    = 0;

            // 画面に表示する悪魔データの格納場所
            DataTable dtUnionList = new DataTable();

            dtUnionList.Columns.Add("グレード1", Type.GetType("System.Int32"));
            dtUnionList.Columns.Add("レア度1", Type.GetType("System.Int32"));
            dtUnionList.Columns.Add("種族1", Type.GetType("System.String"));
            dtUnionList.Columns.Add("悪魔名1", Type.GetType("System.String"));
            dtUnionList.Columns.Add("=", Type.GetType("System.String"));
            dtUnionList.Columns.Add("グレード2", Type.GetType("System.Int32"));
            dtUnionList.Columns.Add("レア度2", Type.GetType("System.Int32"));
            dtUnionList.Columns.Add("種族2", Type.GetType("System.String"));
            dtUnionList.Columns.Add("悪魔名2", Type.GetType("System.String"));

            // 合体種族テーブルから、指定種族を含む合体パターンを抽出
            string query = QueryCreate.CreateGetUnionTribeMaterial(DevileTribe);

            DA.DataAccess da          = new DA.DataAccess();
            DataTable     dtTribeInfo = new DataTable();

            dtTribeInfo = da.readdata(query);

            foreach (DataRow inforow in dtTribeInfo.Rows)
            {
                // 抽出したパターンの内、指定種族ではない方の種族の全悪魔を取得
                if (inforow["DevilBase"].ToString() == DevileTribe)
                {
                    query      = QueryCreate.CreateGetDevilTableUnionInfo(inforow["DevilAdd"].ToString());
                    dtBaseInfo = da.readdata(query);
                }
                else
                {
                    query      = QueryCreate.CreateGetDevilTableUnionInfo(inforow["DevilBase"].ToString());
                    dtBaseInfo = da.readdata(query);
                }
                // 合体結果の悪魔を取得(結果に全書no1001以上の悪魔は含めない)
                query       = QueryCreate.CreateGetDevilTableUnionInfoUserSelect(inforow["DevilAfter"].ToString());
                dtAfterInfo = da.readdata(query);

                // 指定悪魔と取得した悪魔を合体させて何ができるか割り出す

                // 対象悪魔の数分ループ
                foreach (DataRow infotargetrow in dtBaseInfo.Rows)
                {
                    // 指定悪魔のグレードと対象種族のグレードを計算して結果のグレード値を算出
                    int calcGrade = (int)(Math.Floor((double)(Grade + int.Parse(infotargetrow["Grade"].ToString())) / 2)) + 1;
                    // 合体結果種族の悪魔情報を全件取得
                    minGrade = int.Parse(dtAfterInfo.Rows[0]["Grade"].ToString());
                    maxGrade = int.Parse(dtAfterInfo.Rows[dtAfterInfo.Rows.Count - 1]["Grade"].ToString());;

                    // 対象となるグレードの悪魔を特定
                    for (int i = 0; i < dtAfterInfo.Rows.Count - 1; i++)
                    {
                        int     afterGrade1 = int.Parse(dtAfterInfo.Rows[i]["Grade"].ToString());
                        int     afterGrade2 = int.Parse(dtAfterInfo.Rows[i + 1]["Grade"].ToString());
                        DataRow addListRow  = dtUnionList.NewRow();
                        // 計算結果よりも対象種族の最低グレードの方が高ければ1レコード目確定
                        if (calcGrade < minGrade)
                        {
                            addListRow["グレード1"] = int.Parse(infotargetrow["Grade"].ToString());
                            addListRow["レア度1"]  = int.Parse(infotargetrow["Reality"].ToString());
                            addListRow["種族1"]   = infotargetrow["TribeName"].ToString();
                            addListRow["悪魔名1"]  = infotargetrow["Name"].ToString();
                            addListRow["="]     = "=";
                            addListRow["グレード2"] = int.Parse(dtAfterInfo.Rows[i]["Grade"].ToString());
                            addListRow["レア度2"]  = int.Parse(dtAfterInfo.Rows[i]["Reality"].ToString());
                            addListRow["種族2"]   = dtAfterInfo.Rows[i]["TribeName"].ToString();
                            addListRow["悪魔名2"]  = dtAfterInfo.Rows[i]["Name"].ToString();
                            dtUnionList.Rows.Add(addListRow);
                            break;
                        }
                        else if (afterGrade1 < calcGrade && afterGrade2 >= calcGrade)
                        {
                            // 計算したグレードが対象悪魔リストの現在行の値と次の行の値の間なら一つ上のグレードの悪魔が該当
                            addListRow["グレード1"] = int.Parse(infotargetrow["Grade"].ToString());
                            addListRow["レア度1"]  = int.Parse(infotargetrow["Reality"].ToString());
                            addListRow["種族1"]   = infotargetrow["TribeName"].ToString();
                            addListRow["悪魔名1"]  = infotargetrow["Name"].ToString();
                            addListRow["="]     = "=";
                            addListRow["グレード2"] = int.Parse(dtAfterInfo.Rows[i + 1]["Grade"].ToString());
                            addListRow["レア度2"]  = int.Parse(dtAfterInfo.Rows[i + 1]["Reality"].ToString());
                            addListRow["種族2"]   = dtAfterInfo.Rows[i + 1]["TribeName"].ToString();
                            addListRow["悪魔名2"]  = dtAfterInfo.Rows[i + 1]["Name"].ToString();
                            dtUnionList.Rows.Add(addListRow);
                            break;
                        }
                        else if (calcGrade > maxGrade)
                        {
                            // 種族最大のグレードをもつ悪魔を計算したグレードが超えていたら、そのパターンは合体不可

                            /*
                             * addListRow["グレード1"] = int.Parse(infotargetrow["Grade"].ToString());
                             * addListRow["レア度1"] = int.Parse(infotargetrow["Reality"].ToString());
                             * addListRow["種族1"] = infotargetrow["TribeName"].ToString();
                             * addListRow["悪魔名1"] = infotargetrow["Name"].ToString();
                             * addListRow["x"] = "=";
                             * addListRow["グレード2"] = int.Parse(dtAfterInfo.Rows[dtAfterInfo.Rows.Count-1]["Grade"].ToString());
                             * addListRow["レア度2"] = int.Parse(dtAfterInfo.Rows[dtAfterInfo.Rows.Count - 1]["Reality"].ToString());
                             * addListRow["種族2"] = dtAfterInfo.Rows[dtAfterInfo.Rows.Count - 1]["TribeName"].ToString();
                             * addListRow["悪魔名2"] = dtAfterInfo.Rows[dtAfterInfo.Rows.Count - 1]["Name"].ToString();
                             * dtUnionList.Rows.Add(addListRow);
                             */
                            break;
                        }
                    }
                }
            }


            return(dtUnionList);
        }