public MainWindow()
 {
     try
     {
         InitializeComponent();
         DevilTable.GetInstance();
     }
     catch (Exception ex)
     {
         MessageBox.Show("起動時にエラーが発生しました。アプリケーションを終了します。再度アプリケーションを起動してみてください。");
         Application.Current.Shutdown();
     }
 }
        /// <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);
        }