1

複数のフィールドを持つDetailsviewがあり、常に挿入モードに設定されています。これらのフィールドのうち、ユーザーが新しいレコードを挿入する前に、そのユーザーがその日付のレコードを既に入力しているかどうかを確認したかったのです。

要求された日付が休日であるかどうか、または同じ日付に対して異なるユーザーからすでに2つの異なる要求が行われている場合(同じ日付を要求する人が2人を超えることはできないため)など、複数の要件を確認する方法を理解する必要がありました。 。)

ポストバックがあるのは挿入が押されたときだけなので、カスタムバリデーターを機能させることができませんでした。

挿入が押されたときにさまざまな検証をチェックする方法があるのではないかと思っていましたが、すべて合格した場合にのみ挿入を実行しますか?

テーブルの複数の列をチェックする必要があります。ユーザーIDと日付。

それが理にかなっていることを願っています。

asp:DetailsView ID = "DetailsView1" runat = "server" DataSourceID = "ObjectDataSource1" DataKeyNames = "bwrequestid" Height = "29px" Width = "928px" AutoGenerateRows = "False" CellPadding = "4" ForeColor = "#333333" GridLines = "None" Style = "margin-right:0px; text-align:left; margin-top:0px;" ondatabound = "DetailsView1_DataBound" oniteminserting = "EntValid_ItemInserting"

        protected void EntValid_ItemInserting(object sender, DetailsViewInsertEventArgs e)
    {
        for (int i = 0; i < e.Values.Count; i++)
        {
            if (e.Values[i] != GetData())
            {
                e.Cancel = true;

                return;
            }
        }
    }

-------データの取得は次のようになります

private DataSet GetData(){ConnectionStringSettingsCollection cssc = ConfigurationManager.ConnectionStrings;

        var sql = "SELECT LEAVETYPE, LEAVECODE FROM TEST.LVTYPE ORDER BY LEAVECODE";

        using (iDB2Connection conn = new iDB2Connection(GetConnectionString()))
        {
            conn.Open();

            using (iDB2Command cmd = new iDB2Command(sql, conn))
            {
                cmd.DeriveParameters();

                using (iDB2DataAdapter da = new iDB2DataAdapter(cmd))
                {
                    DataSet ds = new DataSet();
                    da.Fill(ds);

                    return ds;
                }
            }
        }
    }

        protected void EntValid_ItemInserting(object sender, DetailsViewInsertEventArgs e)
    {
        for (int i = 0; i < e.Values.Count; i++)
        {
            if (e.Values[i] != GetData())
            {
                e.Cancel = true;

                return;
            }
        }
    }

-------データの取得は次のようになります

private DataSet GetData(){ConnectionStringSettingsCollection cssc = ConfigurationManager.ConnectionStrings;

        var sql = "SELECT LEAVETYPE, LEAVECODE FROM TEST.LVTYPE ORDER BY LEAVECODE";

        using (iDB2Connection conn = new iDB2Connection(GetConnectionString()))
        {
            conn.Open();

            using (iDB2Command cmd = new iDB2Command(sql, conn))
            {
                cmd.DeriveParameters();

                using (iDB2DataAdapter da = new iDB2DataAdapter(cmd))
                {
                    DataSet ds = new DataSet();
                    da.Fill(ds);

                    return ds;
                }
            }
        }

}

4

1 に答える 1

0

サーバー側の検証のみを使用していると思いますが、これは正しいですか? もしそうなら(私はサーバー側とクライアント側の両方の検証を提案しますが、それは重要ではありません)まず、詳細ビューのItemInsertingイベントを処理する必要があります。

その時点で、レコードに完全にアクセスできます。詳細については、 MSDNを参照してください。

ItemInserting イベント ハンドラー内で検証を行い、失敗した場合は e.Cancel = true; を使用します。

元:

void CustomerDetail_ItemInserting(object sender, 
    DetailsViewInsertEventArgs e)
{
    for (int i = 0; i < e.Values.Count; i++)
    {
        if (e.Values[i] != *your validation here*)
        {
            e.Cancel = true;

            //set your validation summary message here
            ...

            return;
        }
    }
}

このハンドラを接続することを忘れないでください:

<asp:DetailsView ID="CustomerDetail" 
    DataSourceID="Details" AutoGenerateRows="false"
    *other properties*
    OnItemInserting="CustomerDetail_ItemInserting" >
于 2012-09-27T14:34:13.853 に答える