c# gridview 不创建新行
c# gridview doesn't create new rows
我有一个网格视图、一个按钮和一个文本框。当在文本框中输入一个值时,单击按钮时该值应显示在网格视图中。一切顺利,直到我插入第二个值。 gridview 刷新页面并将第二个值插入第一个值的位置,而不是创建新行并保留数据。
有人告诉我这与页面加载有关,但我不知道如何阻止这种情况发生。
这是我的代码:
protected void Buton1_Click(object sender, EventArgs e)
{
DataTable dt = new DataTable();
DataColumn dc = new DataColumn("Name");
dt.Columns.Add(dc);
DataRow dr = dt.NewRow();
dr["Name"] = TextBox1.Text;
dt.Rows.Add(dr);
dt.AcceptChanges();
GridView1.DataSource = dt;
GridView1.DataBind();
}
尝试以下代码:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostback)
{
DataTable dt = new DataTable();
ViewState.Add("dt", dt);
}
}
protected void Buton1_Click(object sender, EventArgs e)
{
Datatable dtable = (Datatable)ViewState["dt"];
if (ViewState["dt"] == null)
{
DataColumn dc = new DataColumn("Name");
dtable.Columns.Add(dc);
}
DataRow dr = dtable.NewRow();
dr["Name"] = TextBox1.Text;
dtable.Rows.Add(dr);
dtable.AcceptChanges();
GridView1.DataSource = dtable;
GridView1.DataBind();
ViewState["dt"] = dtable;
}
Asp.net 是无状态的,因此您必须使用一些状态管理技术来管理控件的状态。例如会话
protected void Buton1_Click(object sender, EventArgs e)
{
DataTable dt =null;
if(Session["GridData"]==null)//Initialize a new session only if first time
{
dt= new DataTable();
DataColumn dc = new DataColumn("Name");
dt.Columns.Add(dc);
}
else
{
dt=Session["GridData"] as DataTable;
}
DataRow dr = dt.NewRow();
dr["Name"] = TextBox1.Text;
dt.Rows.Add(dr);
dt.AcceptChanges();
GridView1.DataSource = dt;
GridView1.DataBind();
Session["GridData"]=dt;//save data in session to retrive in next click
}
试试这个:
private DataTable _dataTable;
protected void Page_Load(object sender, EventArgs e)
{
InitializeTable();
}
private void InitializeTable()
{
if (_dataTable != null) return;
_dataTable = new DataTable();
DataColumn dc = new DataColumn("Name");
_dataTable.Columns.Add(dc);
}
protected void Buton1_Click(object sender, EventArgs e)
{
DataRow dr = _dataTable.NewRow();
dr["Name"] = TextBox1.Text;
_dataTable.Rows.Add(dr);
_dataTable.AcceptChanges();
GridView1.DataSource = _dataTable;
GridView1.DataBind();
}
我有一个网格视图、一个按钮和一个文本框。当在文本框中输入一个值时,单击按钮时该值应显示在网格视图中。一切顺利,直到我插入第二个值。 gridview 刷新页面并将第二个值插入第一个值的位置,而不是创建新行并保留数据。
有人告诉我这与页面加载有关,但我不知道如何阻止这种情况发生。
这是我的代码:
protected void Buton1_Click(object sender, EventArgs e)
{
DataTable dt = new DataTable();
DataColumn dc = new DataColumn("Name");
dt.Columns.Add(dc);
DataRow dr = dt.NewRow();
dr["Name"] = TextBox1.Text;
dt.Rows.Add(dr);
dt.AcceptChanges();
GridView1.DataSource = dt;
GridView1.DataBind();
}
尝试以下代码:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostback)
{
DataTable dt = new DataTable();
ViewState.Add("dt", dt);
}
}
protected void Buton1_Click(object sender, EventArgs e)
{
Datatable dtable = (Datatable)ViewState["dt"];
if (ViewState["dt"] == null)
{
DataColumn dc = new DataColumn("Name");
dtable.Columns.Add(dc);
}
DataRow dr = dtable.NewRow();
dr["Name"] = TextBox1.Text;
dtable.Rows.Add(dr);
dtable.AcceptChanges();
GridView1.DataSource = dtable;
GridView1.DataBind();
ViewState["dt"] = dtable;
}
Asp.net 是无状态的,因此您必须使用一些状态管理技术来管理控件的状态。例如会话
protected void Buton1_Click(object sender, EventArgs e)
{
DataTable dt =null;
if(Session["GridData"]==null)//Initialize a new session only if first time
{
dt= new DataTable();
DataColumn dc = new DataColumn("Name");
dt.Columns.Add(dc);
}
else
{
dt=Session["GridData"] as DataTable;
}
DataRow dr = dt.NewRow();
dr["Name"] = TextBox1.Text;
dt.Rows.Add(dr);
dt.AcceptChanges();
GridView1.DataSource = dt;
GridView1.DataBind();
Session["GridData"]=dt;//save data in session to retrive in next click
}
试试这个:
private DataTable _dataTable;
protected void Page_Load(object sender, EventArgs e)
{
InitializeTable();
}
private void InitializeTable()
{
if (_dataTable != null) return;
_dataTable = new DataTable();
DataColumn dc = new DataColumn("Name");
_dataTable.Columns.Add(dc);
}
protected void Buton1_Click(object sender, EventArgs e)
{
DataRow dr = _dataTable.NewRow();
dr["Name"] = TextBox1.Text;
_dataTable.Rows.Add(dr);
_dataTable.AcceptChanges();
GridView1.DataSource = _dataTable;
GridView1.DataBind();
}