我有一个数据网格,我已经填充了sql数据库中的数据。我还添加了一个功能,可以将新联系人添加到数据库,该功能运行良好。我遇到的问题是,在添加联系人并点击F5(刷新网页)后,它会向数据库添加另一个相同的联系人。
我在回发后清除了文本字段,但不知何故,字符串留在内存中,每次刷新网页时都会添加另一个联系人。
我也有点击按钮后数据网格没有立即更新的问题,这就是为什么我必须首先更新页面。我相信这两个问题可能是相关的。
这是我的代码背后,我不认为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();
}
}
答案 0 :(得分:3)
如果按F5,它将重复您的最后一个请求,即在这种情况下向db添加记录。在插入记录之前,您必须检查数据库是否存在记录,以避免这种情况。
其次,如果需要使用上次输入的值更新数据网格,则需要在输入记录后重新绑定数据网格。从Page_Init方法中删除数据绑定代码,并使用相同的代码创建一个新方法,如 BindGrid(),并执行以下操作
protected void Page_Load(object sender, EventArgs e)
{
if(!Page.IsPostBack){
BindGrid();
}
}
另外,添加BindGrid();作为Button1_Click()方法的最后一行(即;输入记录后)
希望有帮助...
答案 1 :(得分:2)
为此您需要检查ViewState与较旧的.. 有一个例子我想出并解决了这个问题。现在,回发后(页面刷新时)不会插入新数据。
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;
}
由于