0

データベースに空白行を追加しないようにすることについて、しばらく前にスレッドを投稿しました。以前は、[行の追加]をクリックすると、ユーザーが新しい行をキャンセルしたかどうかに関係なく、データベースに空白の行が自動的に追加されていました。私はそれを理解しましたが、今、新しい問題に直面しました。ユーザーが新しい行の編集中にページをリロードすることを決定した場合(F5)、データベースに空白の行が追加されます。これは私の状況ではノーノーです。誰かが私がそれを避ける方法を理解するのを手伝ってもらえますか?

以下は私の挿入コードです:

protected void gv_RowCommand(object sender, GridViewCommandEventArgs e)
    {

        if (e.CommandName == "Insert") //- this is needed to explain that the INSERT command will only work when INSERT is clicked
        {
            gv.DataBind();

            DataTable d = dbcon.GetDataTable("SELECT * FROM CIS.CIS_TRANS ORDER BY ID DESC", "ProjectCISConnectionString");

            string transCode = "", fundCode = "", BSA_CD = "", DP_TYPE = "";

            if (d.Rows.Count > 0)
            {
                transCode = d.Rows[0]["TRANS_CD"].ToString();
                fundCode = d.Rows[0]["FUND_CD"].ToString();
                BSA_CD = d.Rows[0]["BSA_CD"].ToString();
                DP_TYPE = d.Rows[0]["DP_TYPE"].ToString();

                if (transCode.Trim().Length > 0)
                {
                    dbcon.Execute("INSERT INTO CIS.CIS_TRANS (ID,TRANS_CD) VALUES(CIS.S_CIS_TRANS.nextval,'')", "ProjectCISConnectionString");

                    gv.DataBind();
                }
            }

            gv.EditIndex = gv.Rows.Count - 1;

        }
        else if (e.CommandName == "Cancel")
        {
            DataTable d = dbcon.GetDataTable("SELECT * FROM CIS.CIS_TRANS ORDER BY ID DESC", "ProjectCISConnectionString");

            string transCode = "";

            if (d.Rows.Count > 0)
            {
                transCode = d.Rows[0]["TRANS_CD"].ToString();

                if (transCode.Trim().Length == 0)
                {
                    dbcon.Execute(string.Format("DELETE CIS.CIS_TRANS WHERE ID = '{0}'", d.Rows[0]["ID"]), "ProjectCISConnectionString");

                    gv.DataBind();
                }
            }


        }
    }
4

2 に答える 2

2

ユーザーによる空白行の挿入を避けたい場合は、バリデーターが必要です。RequiredFieldValidator挿入テンプレートに追加します。

<asp:RequiredFieldValidator runat="server" ID="valFieldName"
< ControlToValidate="txtFieldName" ErrorMessage="FieldName is missing" />

メソッドPage.IsValid == trueで、データベースに挿入する前に確認してください。

編集:ポストバックを完全に回避したい場合は、グリッド全体をUpdatePanel:に挿入できます。

<asp:UpdatePanel>
    <ContentTemplate>
        <asp:GrdiView>
        ....
        </asp:GridView>
    </ContentTemplate>
</asp:UpdatePanel>

これで、ユーザーがF5を押すと、ページを再度リロードするだけで、挿入コマンドをポストバックしません。

于 2012-08-08T15:23:24.407 に答える
0

コードの一部にあまりにも多くのロジックを取り込もうとしているようです。データベースロジックをボタンコマンドに配置します。ユーザーがこのボタンをスパムするだけだと想像してみてください。これにより、大量の空の行が発生します。

このアプローチを試してください:データベースロジックとUIロジック(MVVMなど)を分割します。これは、今日では一般的なパターンです。

すべてのオブジェクトを作成し、ユーザーが「保存」ボタンを押したとします(これは、行を変更することによっても発生する可能性があります)。保存コマンドが実行された後、ビューモデル(ビューの背後にあるロジック)は、たとえばデータを検証できます。したがって、UIの機能をはるかに簡単に拡張できます(前述のとおり、検証など)。

現在のコードでこれを実行したい場合は、拡張するたびに爆発的になります。このコードを維持するのが恐ろしいまで、それほど時間はかかりません。

VM内のすべてが発生した後(検証など)、DBへのトランザクションコマンドが発生する可能性があります(myEntities.Save()など)。そして、このメソッドは、ビジネスオブジェクトが正しくSQLに変換され、データベースに格納されることを提供します。

これはMVVMパターンのごく簡単な説明でしたが、ここでの唯一の適切な解決策のように思えます。

于 2012-08-08T15:39:32.153 に答える