2

C# と ASP.NET を使用して Web アプリケーションに取り組んでいます。同じページのテキストボックスを介してグリッドビューにデータをバインドしています。「保存」ボタンのクリックイベントにバインディングメソッドを記述しました。

button_clickさて、「保存」イベントを介してテキストボックスからグリッドビューにデータを保存するときにページを更新すると、グリッドビューが重複した行に再びバインドされるのは本当に奇妙なことです。Firefox、Chrome、および IE 8 でページを読み込もうとしましたが、結果は否定的です....

なぜそれが起こっているのかを誰かに知らせて、それを解決するように案内してもらえますか....

これは私のC#コードです:

string con = ConfigurationSettings.AppSettings["ConnectionStrings"];

protected void Page_Load(オブジェクト送信者, EventArgs e) {

    tbladdasset.Visible = false;
    btnsaveasset.Enabled = false;
    lblErrMsg.Text = "";

    if (!IsPostBack)
    {
        bindassets("", "");
        ViewState["sortOrder"] = "";
    }
}

private void bindassets(string sortExp, string sortDir)
{
    try
    {
        SqlConnection con1 = new SqlConnection(con);
        con1.Open();
        SqlCommand cmd = new SqlCommand("select Description,CONVERT(VARCHAR(10), RecievedDate, 101) as DateRecieved,cost,Modelno,Quantity from Asset", con1);
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        da.Fill(dt);
        con1.Close();

        if (dt.Rows.Count > 0)
        {
            DataView dv = dt.DefaultView;

            if (sortExp != string.Empty)
            {
                dv.Sort = string.Format("{0} {1}", sortExp, sortDir);
            }

            grdvAssets.DataSource = dv;
            grdvAssets.DataBind();

        }
        else
        {
            lblErrMsg.Text = "No data found...";
        }

        btnsaveasset.Enabled = false;
        tbladdasset.Visible = false;
    }
    catch
    {
        lblErrMsg.Text = "Failed to connect server...";
    }
}

protected void btnaddnew_Click(object sender, EventArgs e)
{
    tbladdasset.Visible = true;
    btnsaveasset.Enabled = true;
    lblErrMsg.Text = "";
    txtdescription.Text = "";
    txtdtrecieved.Text = "";
    txtcost.Text = "";
    txtmodelno.Text = "";
    txtquantity.Text = "";
}

protected void btnsaveasset_Click(object sender, EventArgs e)
{
        if (txtdescription.Text != "" && txtdtrecieved.Text != "" && txtcost.Text != "" && txtmodelno.Text != "" && txtquantity.Text != "")
        {
            try
            {
                string desc= txtdescription.Text;
                DateTime dtrecd = Convert.ToDateTime(txtdtrecieved.Text);
                string cost = txtcost.Text;
                string modelno = txtmodelno.Text;
                double quantity = Convert.ToDouble(txtquantity.Text);
                SqlConnection sqlcon = new SqlConnection(con);
                sqlcon.Open();
                string save = "Insert into Asset(Description,Recieveddate,cost,Modelno,Quantity)values(@desc,@date,@cost,@modelno,@quantity)";
                SqlCommand cmd = new SqlCommand(save, sqlcon);
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.Add("@desc", desc);
                cmd.Parameters.Add("@date", dtrecd);
                cmd.Parameters.Add("@cost", cost);
                cmd.Parameters.Add("@modelno", modelno);
                cmd.Parameters.Add("@quantity", quantity);
                cmd.ExecuteNonQuery();
                sqlcon.Close();
                bindassets("", "");
                btnsaveasset.Enabled = false;
                txtdescription.Text = "";
                txtdtrecieved.Text = "";
                txtcost.Text = "";
                txtmodelno.Text = "";
                txtquantity.Text = "";
                lblErrMsg.Text = "data inserted successfully..";
            }
            catch
            {
                lblErrMsg.Text = "Please enter valid data and try again...";
            }
        }
        else
        {
            lblErrMsg.Text = "Please enter valid data and try again...";
        }

}

protected void grdvAssets_Sorting(object sender, GridViewSortEventArgs e)
{
    bindassets(e.SortExpression, sortOrder);
}

public string sortOrder
{
    get
    {
        if (ViewState["sortOrder"].ToString() == "desc")
        {
            ViewState["sortOrder"] = "asc";
        }
        else
        {
            ViewState["sortOrder"] = "desc";
        }

        return ViewState["sortOrder"].ToString();
    }
    set
    {
        ViewState["sortOrder"] = value;
    }
}

誰でも私を助けてください.....よろしくお願いします..

4

2 に答える 2

3

それはよくある問題です。同様の SO の質問を確認してください: Webforms Refresh problemHow to stop disabled postback

一言で言えば、Webブラウザの更新ボタンは、あなたのケースでは最後のリクエストをサーバーに送信するだけな"Save" button click eventので、行が重複します。Response.Redirectを使用すると、最後のリクエストはページへのナビゲーションだけになるため、更新によって望ましくない影響が生じることはありません。

編集済み

コードを追加したことがわかります。ここに回避策があります。データをデータベースに保存しているという事実は、非常に役立ちます。ページ読み込みイベントの最初のことは、ページが IsPostBack かどうかを確認する必要はなく、bindassets("", "");メソッドを呼び出すだけです。

保存ボタンのクリックイベントについて。bindassets("", "");ページの読み込みから呼び出されるので、呼び出す必要はありません。

protected void btnsaveasset_Click(object sender, EventArgs e)
{
        if (txtdescription.Text != "" && txtdtrecieved.Text != "" && txtcost.Text != "" && txtmodelno.Text != "" && txtquantity.Text != "")
        {
            try
            {
                string desc= txtdescription.Text;
                DateTime dtrecd = Convert.ToDateTime(txtdtrecieved.Text);
                string cost = txtcost.Text;
                string modelno = txtmodelno.Text;
                double quantity = Convert.ToDouble(txtquantity.Text);
                SqlConnection sqlcon = new SqlConnection(con);
                sqlcon.Open();
                string save = "Insert into Asset(Description,Recieveddate,cost,Modelno,Quantity)values(@desc,@date,@cost,@modelno,@quantity)";
                SqlCommand cmd = new SqlCommand(save, sqlcon);
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.Add("@desc", desc);
                cmd.Parameters.Add("@date", dtrecd);
                cmd.Parameters.Add("@cost", cost);
                cmd.Parameters.Add("@modelno", modelno);
                cmd.Parameters.Add("@quantity", quantity);
                cmd.ExecuteNonQuery();
                sqlcon.Close();
                //bindassets("", "");
                btnsaveasset.Enabled = false;
                txtdescription.Text = "";
                txtdtrecieved.Text = "";
                txtcost.Text = "";
                txtmodelno.Text = "";
                txtquantity.Text = "";
                lblErrMsg.Text = "data inserted successfully..";

            }
            catch
            {
                lblErrMsg.Text = "Please enter valid data and try again...";
            }
        }
        else
        {
            lblErrMsg.Text = "Please enter valid data and try again...";
        }
        Response.Redirect("nameofpage.aspx", false);//does a charm. browser refresh button will repeat last action and from now on that's a Response.Redirect("nameofpage.aspx", false). thus no duplicate records
}
于 2011-09-23T10:22:01.713 に答える
0
if (!IsPostBack)
{
    Bind(); //bind data to grid
}
于 2011-09-23T10:03:32.707 に答える