C#向现有数据表添加新行的问题

C#向现有数据表添加新行的问题,c#,asp.net,.net,C#,Asp.net,.net,我试图在onClick上添加一个新行。然而,它在添加到新行的瞬间替换了我的现有行 代码如下: Main.cs protected void Button1_Click(object sender, EventArgs e) { DateTime selectedDate = CalendarMain.SelectedDate; string SportType = ddlSportType.SelectedItem.ToString(); string distance

我试图在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();
}
 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 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;
}
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;
}

我不确定我错过了什么。请告诉我我的错误。非常感谢

您的数据表是在
addPlanDetailDataRow
中本地定义的。它应该在类范围内定义并实例化一次,以保留以前的值。以用于在某些方法中向datatable中添加列的方法为例,以便只调用一次

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被声明为数据成员,并且该类的所有方法都可以访问,因此不需要返回DataTable。这将更改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中的数据。

您的DataTable是在
addPlanDetailDataRow
中本地定义的。它应该在类范围内定义并实例化一次,以保留以前的值。以用于在某些方法中向datatable中添加列的方法为例,以便只调用一次

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被声明为数据成员,并且该类的所有方法都可以访问,因此不需要返回DataTable。这将更改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中或将数据置于数据库中。

使用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;
}

使用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;
}

我尝试了一个示例页面,其工作原理见下面的代码

//回发后保持数据尝试将数据表置于Viewstate并查看数据表的大小

//视图状态,通过启用跟踪。如果不太大且小于1MB,则使用Viewstate

//因为它更高效,并且不使用任何服务器资源

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();
}
 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 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;
}
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;
}

我尝试了一个示例页面,其工作原理见下面的代码

//回发后保持数据尝试将数据表置于Viewstate并查看数据表的大小

//视图状态,通过启用跟踪。如果不太大且小于1MB,则使用Viewstate

//因为它更高效,并且不使用任何服务器资源

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();
}
 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 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;
}
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;
}

您每次都在重新创建
数据表
,因此您只能看到当前行。您好,我曾经尝试在main中创建一次表,并将其传递给“addPlanDetailDataRow(dt)”,但不知怎的,它不起作用。您每次都在创建
数据表
,因此您只能看到当前行。您好,我曾经尝试过在main创建一次表,并将其传递给“addPlanDetailDataRow(dt)”,但不知何故它不起作用嗨,我尝试过在if(!ispostback)下的页面加载期间调用InitDataTable(),但它不起作用谢谢你的帮助=)欢迎你,您可以在问题中添加asp.net标记,以明确您正在处理web表单。您好,我已尝试在页面加载期间在if(!ispostback)下调用InitDataTable(),但无效谢谢您的帮助=)欢迎,您可以在问题中添加asp.net标记,以明确您正在处理web表单。谢谢您的帮助=)谢谢您的帮助=)