0

gridview行の編集にaspコマンドフィールドタイプボタンを使用しています。ユーザーがレコードを更新するたびに、行がグリッドに表示されないと想定されます。ShowAllClasses() メソッドは、最近更新された行を除いて、sql db からレコードをフェッチすることを想定しています。

「更新」コマンド フィールド ボタンの動作が変更されました。

Localhost : ボタンをクリックすると、行が非表示になります (バインドが再度行われることを意味します)。この場合、レコードは 1 回更新されます。(要求に応じ)

展開されたアプリケーション: ユーザーがクリックしても行が非表示にならず、ユーザーはボタンを何度もクリックできます (あたかも機能していないかのように)。ただし、ユーザーがボタンのクリックを停止すると、わずかな遅延の後、gridview の編集モードが終了し、更新後のバインディングが開始されます。

悪いことは、ボタンがクリックされるたびに sql テーブルが更新されることです。これを修正する方法を教えてください。

これが私が使用しているコードです

GridView1 内のコマンド フィールドのマークアップ:

<asp:CommandField ButtonType="Button" HeaderText="Edit/Update" ShowEditButton="True"
                            ShowHeader="True" UpdateText="Set Class" ItemStyle-HorizontalAlign="Center" />

GridView RowUpdating イベント:

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{

        lblError.Text = string.Empty;

        int iTutorID = Convert.ToInt32(Session["EID"]);

        DropDownList ddlTime = GridView1.Rows[e.RowIndex].FindControl("ddlClassTime") as DropDownList;
        string sClassTime = ddlTime.SelectedItem.Text;

        HiddenField hf = GridView1.Rows[e.RowIndex].FindControl("sIdHidden") as HiddenField;
        int iSID = Convert.ToInt32(hf.Value);

        hf = GridView1.Rows[e.RowIndex].FindControl("cIdHidden") as HiddenField;
        int iCID = Convert.ToInt32(hf.Value);

        hf = GridView1.Rows[e.RowIndex].FindControl("hfClassTime") as HiddenField;
        string sOriginalClassTime = hf.Value.ToString();

        if (sOriginalClassTime.Length < 8)
            sOriginalClassTime = "0" + sOriginalClassTime;

        DropDownList ddlDate = GridView1.Rows[e.RowIndex].FindControl("ddlClassDate") as DropDownList;
        DateTime dNewDate = Convert.ToDateTime(ddlDate.SelectedValue);

        Label lblLesson = GridView1.Rows[e.RowIndex].FindControl("lblLesson") as Label;
        string sLesson = lblLesson.Text;

        DateTime dClassDate = Convert.ToDateTime(ddlAdvDay.SelectedValue);

        //cond: same date and same time set
        if (sOriginalClassTime == sClassTime && dNewDate == dClassDate.Date)
        {
            //show error
            lblError.Text = "Same class date and time cannot be set as Advanced class";
            return;
        }

        lblError.Text = string.Empty;

        BLClass blClass = new BLClass();
        //1. insert in makeup table today's class
        //2. insert in classdetails table

        //1. insert in makeup table with today's date
        blClass.InsertAdvancedClass(iTutorID, iSID, iCID, dClassDate, dNewDate);

        //2. insert in classdetails table
        blClass.InsertClassDetails(iTutorID, iSID, iCID, dNewDate, sClassTime, "Advanced", sLesson);           


        GridView1.EditIndex = -1;
        ShowAllClasses();
}

Grid を DataSource にバインドする方法:

private void ShowAllClasses()
{
        lblError.Text = string.Empty;

        int iTutorID = Convert.ToInt32(Session["EID"]);    

        BLClass blClass = new BLClass();

        DateTime dClassDate = Convert.ToDateTime(ddlAdvDay.SelectedValue);


        DataTable dtClass = blClass.GetAdvancedClasses(iTutorID, dClassDate.Date);            

        //temp method for date display format
        FixDateFormat(dtClass);
        dtClass.AcceptChanges();

        GridView1.DataSource = dtClass;
        GridView1.DataBind();
 }
4

1 に答える 1

0

行更新イベントの最後にある更新リンク ボタンを無効にします。次に、行編集イベントでコントロールをアクティブに設定します。これにより、ユーザーがボタンを 2 回クリックするのを防ぐことができます。本番サーバーへの接続が悪いようです。

  this.mybutton.enabled = false:
于 2012-11-16T23:42:46.723 に答える