2012-03-19 10 views
1

私はSQLデータベースのデータで満たしたデータグリッドを持っています。また、データベースに新しい連絡先を追加する機能を追加しました。私が持っている問題は、連絡先を追加してF5(Webページの更新)を押すと、データベースに別の連絡先が追加されたことです。ASP.NETページリフレッシュに新しいデータを追加することを避ける

私はポストバック後にテキストフィールドをクリアしますが、何らかの理由で文字列がメモリに残り、ウェブページをリフレッシュするたびに別の連絡先が追加されます。

ボタンをクリックした直後にデータグリッドが更新されないという問題もあります。その理由は、最初にページを更新する必要があったからです。私はこれらの2つの問題が関連していると信じています。

ここに私のコードがありますが、私はaspxページは必要ではないと思っていますが、必要ならばそれを与えることができます。

public partial class Default : System.Web.UI.Page 
{ 
    SqlConnection connection = new SqlConnection("server = Sqlconnection; uid = username; pwd = password; database = database;"); 

    protected void Page_Init(object sender, EventArgs e) 
    { 
     //------------------------------------------------DataGrid-------------------------------------------------- 
     SqlDataAdapter SqlCommandDG = new SqlDataAdapter("SELECT FirstName, LastName, Email, PhoneNumber, CompanyName FROM ContactPerson CP, Company C WHERE CP.[CompanyID] = C.[Company_ID]", connection); 

     DataSet ds = new DataSet(); 
     SqlCommandDG.Fill(ds); 

     DataView source = new DataView(ds.Tables[0]); 
     DataGrid1.DataSource = source; 
     DataGrid1.DataBind(); 

     //----------------------------------------------Dropdown list------------------------------------------------ 
     SqlCommand SqlCommandDD = new SqlCommand("SELECT * FROM Company"); 
     SqlCommandDD.Connection = connection; 
     connection.Open(); 

     DropDownList1.DataSource = SqlCommandDD.ExecuteReader(); 
     DropDownList1.DataValueField = "Company_ID"; 
     DropDownList1.DataTextField = "CompanyName"; 
     DropDownList1.DataBind(); 

     connection.Close(); 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    protected void Button1_Click(object sender, EventArgs e) 
    { 
     connection.Open(); 

     string fName = fNameTextBox.Text; 
     string lName = lNameTextBox.Text; 
     string email = EmailTextBox.Text; 
     string phoneNr = phoneNrTextBox.Text; 
     string company = DropDownList1.SelectedValue; 

     string sqlquery = ("INSERT INTO ContactPerson (FirstName, LastName, Email, PhoneNumber, CompanyID) VALUES ('" + fNameTextBox.Text + "','" + lNameTextBox.Text + "','" + EmailTextBox.Text + "','" + phoneNrTextBox.Text + "','" + DropDownList1.SelectedValue + "')"); 
     SqlCommand command = new SqlCommand(sqlquery, connection); 

     command.Parameters.AddWithValue("FirstName", fName); 
     command.Parameters.AddWithValue("LastName", lName); 
     command.Parameters.AddWithValue("Email", email); 
     command.Parameters.AddWithValue("PhoneNumber", phoneNr); 
     command.Parameters.AddWithValue("CompanyID", company); 
     command.ExecuteNonQuery(); 

     fNameTextBox.Text = string.Empty; 
     lNameTextBox.Text = string.Empty; 
     EmailTextBox.Text = string.Empty; 
     phoneNrTextBox.Text = string.Empty; 

     connection.Close(); 
    } 
} 

答えて

3

この場合、F5キーを押すと最後のリクエストが繰り返されます。これを避けるには、レコードを挿入する前にdbのレコードの有無を確認する必要があります。

第2に、最後に入力した値でデータグリッドを更新する必要がある場合は、レコードを入力した後にデータグリッドを再バインドする必要があります。 )Page_Initメソッドからデータバインディングコードを削除し、(BindGridを言って同じコードで新しいメソッドを作成)。また、次の

protected void Page_Load(object sender, EventArgs e) 
{ 
    if(!Page.IsPostBack){ 
    BindGrid(); 
    } 
} 

を行う、(BindGridを追加します。 Button1 Click()メソッド(つまり、レコードを入力した後)の最後の行として...あなたは古いものとのViewStateをチェックする必要があり、そのために

+0

は、どのように私は、データベース内のすべての私のrecods経由せずに存在することを確認するのでしょうか?私は、成功していないSQLクエリでIF NOT EXISTS行を試しました。また、私はBindGrid()メソッドを作成し、それをデータグリッドにバインドする方法はありますか? – Joel

+1

@Mynter:BindGrid()メソッドを作成するには? - Kafの答えから、 "Page_Initメソッドからデータバインディングコードを削除し、同じコードで新しいメソッドを作成する"という名前の "BindGrid()"から。 – Chris

+0

**作成方法:** 'private void BindGrid(){// Page_Init()メソッドからすべてのコードをカットアンドペーストします}'あなたはすでに上記のコードでグリッドをバインドしています。 'IF NOT EXIST'ビットで質問を投稿できますか? – Kaf

2

を助け

希望..私は考え出し例は ありその問題を解決し解決しました。新しいデータはポストバックの後に挿入されません(ページの更新時に)。

protected void Page_Load(object sender, EventArgs e) 
{ 

    if(!Page.IsPostBack && !IsRefresh){ 
    BindGrid(); 
    } 
} 
private bool _isRefresh; 

    public bool IsRefresh 
    { 
     get { return _isRefresh; } 
    } 

    protected override void LoadViewState(object savedState) 
    { 
     object[] allStates = (object[])savedState; 
     base.LoadViewState(allStates[0]); 
     _refreshState = Convert.ToBoolean(allStates[1]); 
     _isRefresh = _refreshState == Convert.ToBoolean(Session["__ISREFRESH"]); 
    } 

    protected override object SaveViewState() 
    { 
     Session["__ISREFRESH"] = _refreshState; 
     object[] allStates = new object[2]; 
     allStates[0] = base.SaveViewState(); 
     allStates[1] = !_refreshState; 
     return allStates; 
    } 

おかげ

関連する問題