C# 向现有数据表添加新行的问题
C# Issue with adding new row to existing datatable
我正在尝试在 onClick 时添加一个新行。但是,它取代了我现有的添加到新行的即时行。
代码如下:
Main.cs
protected void Button1_Click(object sender, EventArgs e)
{
DateTime selectedDate = CalendarMain.SelectedDate;
string SportType = ddlSportType.SelectedItem.ToString();
string distance = ddlDistance.SelectedItem.ToString();
plan wp = new plan();
wp.Time_Start = selectedDate;
wp.Duration = distance;
wp.Activity = SportType;
DataTable dt = wp.addPlanDetailDataRow();
gvActivityList.DataSource = dt;
gvActivityList.DataBind();
}
plan.cs
public DataTable addPlanDetailDataRow()
{
DataTable dt = new DataTable();
dt.Columns.Add("Activity");
dt.Columns.Add("Duration");
dt.Columns.Add("status");
dt.Columns.Add("Time_Start");
dt.Columns.Add("Plan_ID");
DataRow newRow = dt.NewRow();
dt.Rows.Add(newRow);
return dt;
}
我不确定我错过了什么。请指导我了解我的错误。非常感谢
您的 DataTable 在 addPlanDetailDataRow
中本地定义。它应该在 class 范围和 instanstiated 中定义一次以保持以前的值。以某种方法在数据表中添加列,以便调用一次。
DataTable dt = new DataTable();
private InitDataTable() //This method should be called once
{
dt.Columns.Add("Activity");
dt.Columns.Add("Duration");
dt.Columns.Add("status");
dt.Columns.Add("Time_Start");
dt.Columns.Add("Plan_ID");
}
public DataTable addPlanDetailDataRow()
{
DataRow newRow = dt.NewRow();
dt.Rows.Add(newRow);
return dt;
}
编辑
由于 DataTable 被声明为数据成员并且可供 class 的所有方法访问,因此您不需要 return 数据表。这将更改 addPlanDetailDataRow,如下所示。另请注意,您只是添加行而不是填充行。
public void addPlanDetailDataRow()
DataRow newRow = dt.NewRow();
newRow["Activity"] = "a1"; //These dummy values should be replaced by real values.
newRow["Duration"] = "d1";
newRow["status"] = "s1";
newRow["Time_Start"] = "st1";
newRow["Plan_ID"] = "p1";
dt.Rows.Add(newRow);
}
调用方法是
gvActivityList.DataSource = addPlanDetailDataRow();
gvActivityList.DataBind();
由于 DataBind 在 asp.net 中使用,您可能需要将 DataTable 放入 ViewState 或将数据放入 DataBase。
使用 ViewState 记住以前的值:
编辑 :-
protected void Button1_Click(object sender, EventArgs e)
{
DateTime selectedDate = CalendarMain.SelectedDate;
string SportType = ddlSportType.SelectedItem.ToString();
string distance = ddlDistance.SelectedItem.ToString();
plan wp = new plan();
wp.Time_Start = selectedDate;
wp.Duration = distance;
wp.Activity = SportType;
DataTable dt = new DataTable();
dt.Columns.Add("Activity");
dt.Columns.Add("Duration");
dt.Columns.Add("status");
dt.Columns.Add("Time_Start");
dt.Columns.Add("Plan_ID");
DataTable dt1 = wp.addPlanDetailDataRow(dt);
gvActivityList.DataSource = dt;
gvActivityList.DataBind();
}
public DataTable addPlanDetailDataRow(DataTable dt)
{
if (ViewState["Datatable"] != null)
{
dt = (DataTable)ViewState["Datatable"];
}
ViewState["Datatable"] = dt;
DataRow dr = dt.NewRow();
dr["Activity"]="value1";
dr["Duration"]="value2";
dr["status"]="value3";
dr["Time_Start"]="value4";
dr["Plan_ID"]="value5";
dt.Rows.Add(dr);
return dt;
}
我尝试了一个示例页面,它的工作原理见下面的代码。
//Persisting Data after PostBack 尝试将数据table放入Viewstate,查看
的大小
// Viewstate,通过启用 Tracing。如果不是太大且小于 1 MB,则使用 Viewstate,
// 因为它更高效并且不使用任何服务器资源。
Main.cs
protected void btn1_Click(object sender, EventArgs e)
{
DateTime selectedDate = DateTime.Now;
string SportType = "Dummy SportType";
string distance = "Dymmy distance";
plan wp = new plan();
wp.Time_Start = selectedDate;
wp.Duration = distance;
wp.Activity = SportType;
DataTable dt;
if (ViewState["Datatable"] != null) //
{
wp.dt = (DataTable)ViewState["Datatable"];
}
else
{
wp.InitDataTable();
}
dt = wp.addPlanDetailDataRow();
ViewState["Datatable"] = dt;
gvActivityList.DataSource = dt;
gvActivityList.DataBind();
}
plan.cs
public plan()
{
//
// TODO: Add constructor logic here
//
}
public DataTable dt;
public void InitDataTable()
{
dt = new DataTable();
dt.Columns.Add("Activity");
dt.Columns.Add("Duration");
dt.Columns.Add("status");
dt.Columns.Add("Time_Start");
dt.Columns.Add("Plan_ID");
}
public DateTime Time_Start;
public string Duration;
public string Activity;
public DataTable addPlanDetailDataRow()
{
DataRow newRow = dt.NewRow();
newRow["Activity"] = this.Activity;
newRow["Duration"] = this.Duration;
newRow["status"] = "s1";
newRow["Time_Start"] = this.Time_Start;
newRow["Plan_ID"] = "p1";
dt.Rows.Add(newRow);
return dt;
}
我正在尝试在 onClick 时添加一个新行。但是,它取代了我现有的添加到新行的即时行。
代码如下:
Main.cs
protected void Button1_Click(object sender, EventArgs e)
{
DateTime selectedDate = CalendarMain.SelectedDate;
string SportType = ddlSportType.SelectedItem.ToString();
string distance = ddlDistance.SelectedItem.ToString();
plan wp = new plan();
wp.Time_Start = selectedDate;
wp.Duration = distance;
wp.Activity = SportType;
DataTable dt = wp.addPlanDetailDataRow();
gvActivityList.DataSource = dt;
gvActivityList.DataBind();
}
plan.cs
public DataTable addPlanDetailDataRow()
{
DataTable dt = new DataTable();
dt.Columns.Add("Activity");
dt.Columns.Add("Duration");
dt.Columns.Add("status");
dt.Columns.Add("Time_Start");
dt.Columns.Add("Plan_ID");
DataRow newRow = dt.NewRow();
dt.Rows.Add(newRow);
return dt;
}
我不确定我错过了什么。请指导我了解我的错误。非常感谢
您的 DataTable 在 addPlanDetailDataRow
中本地定义。它应该在 class 范围和 instanstiated 中定义一次以保持以前的值。以某种方法在数据表中添加列,以便调用一次。
DataTable dt = new DataTable();
private InitDataTable() //This method should be called once
{
dt.Columns.Add("Activity");
dt.Columns.Add("Duration");
dt.Columns.Add("status");
dt.Columns.Add("Time_Start");
dt.Columns.Add("Plan_ID");
}
public DataTable addPlanDetailDataRow()
{
DataRow newRow = dt.NewRow();
dt.Rows.Add(newRow);
return dt;
}
编辑
由于 DataTable 被声明为数据成员并且可供 class 的所有方法访问,因此您不需要 return 数据表。这将更改 addPlanDetailDataRow,如下所示。另请注意,您只是添加行而不是填充行。
public void addPlanDetailDataRow()
DataRow newRow = dt.NewRow();
newRow["Activity"] = "a1"; //These dummy values should be replaced by real values.
newRow["Duration"] = "d1";
newRow["status"] = "s1";
newRow["Time_Start"] = "st1";
newRow["Plan_ID"] = "p1";
dt.Rows.Add(newRow);
}
调用方法是
gvActivityList.DataSource = addPlanDetailDataRow();
gvActivityList.DataBind();
由于 DataBind 在 asp.net 中使用,您可能需要将 DataTable 放入 ViewState 或将数据放入 DataBase。
使用 ViewState 记住以前的值:
编辑 :-
protected void Button1_Click(object sender, EventArgs e)
{
DateTime selectedDate = CalendarMain.SelectedDate;
string SportType = ddlSportType.SelectedItem.ToString();
string distance = ddlDistance.SelectedItem.ToString();
plan wp = new plan();
wp.Time_Start = selectedDate;
wp.Duration = distance;
wp.Activity = SportType;
DataTable dt = new DataTable();
dt.Columns.Add("Activity");
dt.Columns.Add("Duration");
dt.Columns.Add("status");
dt.Columns.Add("Time_Start");
dt.Columns.Add("Plan_ID");
DataTable dt1 = wp.addPlanDetailDataRow(dt);
gvActivityList.DataSource = dt;
gvActivityList.DataBind();
}
public DataTable addPlanDetailDataRow(DataTable dt)
{
if (ViewState["Datatable"] != null)
{
dt = (DataTable)ViewState["Datatable"];
}
ViewState["Datatable"] = dt;
DataRow dr = dt.NewRow();
dr["Activity"]="value1";
dr["Duration"]="value2";
dr["status"]="value3";
dr["Time_Start"]="value4";
dr["Plan_ID"]="value5";
dt.Rows.Add(dr);
return dt;
}
我尝试了一个示例页面,它的工作原理见下面的代码。
//Persisting Data after PostBack 尝试将数据table放入Viewstate,查看
的大小// Viewstate,通过启用 Tracing。如果不是太大且小于 1 MB,则使用 Viewstate,
// 因为它更高效并且不使用任何服务器资源。
Main.cs
protected void btn1_Click(object sender, EventArgs e)
{
DateTime selectedDate = DateTime.Now;
string SportType = "Dummy SportType";
string distance = "Dymmy distance";
plan wp = new plan();
wp.Time_Start = selectedDate;
wp.Duration = distance;
wp.Activity = SportType;
DataTable dt;
if (ViewState["Datatable"] != null) //
{
wp.dt = (DataTable)ViewState["Datatable"];
}
else
{
wp.InitDataTable();
}
dt = wp.addPlanDetailDataRow();
ViewState["Datatable"] = dt;
gvActivityList.DataSource = dt;
gvActivityList.DataBind();
}
plan.cs
public plan()
{
//
// TODO: Add constructor logic here
//
}
public DataTable dt;
public void InitDataTable()
{
dt = new DataTable();
dt.Columns.Add("Activity");
dt.Columns.Add("Duration");
dt.Columns.Add("status");
dt.Columns.Add("Time_Start");
dt.Columns.Add("Plan_ID");
}
public DateTime Time_Start;
public string Duration;
public string Activity;
public DataTable addPlanDetailDataRow()
{
DataRow newRow = dt.NewRow();
newRow["Activity"] = this.Activity;
newRow["Duration"] = this.Duration;
newRow["status"] = "s1";
newRow["Time_Start"] = this.Time_Start;
newRow["Plan_ID"] = "p1";
dt.Rows.Add(newRow);
return dt;
}