【问题标题】:Retrieve Values from asp control in c# code behind在 c# 代码后面从 asp 控件中检索值
【发布时间】:2014-01-22 15:54:33
【问题描述】:

我已经广泛寻找这个问题的答案,但我只能非常接近。我有一个用于添加和编辑记录的 Web 表单。当在 gridview 中选择一条记录时,会设置一个会话变量,然后在页面加载时使用它来填充文本字段。如果未设置会话变量,则表单将为空白并且逻辑作为新记录运行。我的问题是我可以成功添加新记录 - 我调试并检查以确保 asp 控件将正确的值传递给后面的代码 - 但我无法成功编辑记录。出于某种原因,文件后面的代码没有从文本框中检索正确的值。相反,它保留了原始填充值,从而违背了编辑的目的。我想这是一个有约束力的问题,但我不确定并且已经搜索完毕。这是我的文件后面的代码:

protected void Page_Load(object sender, EventArgs e)
{
    resultOutput.Visible = false;//Output results as to whether or not a record was added successfully is automatically hidden at page load

    //Checking to see if session variable has been created
    if (Session["editID"] != null)
    {               
        //Create objects to get recipe data
        dbCRUD db = new dbCRUD();
        Recipe editRecipe = new Recipe();

        //Grabbing session ID 
        var id = Convert.ToInt32(Session["editID"]);

        //Call method to retrieve db data
        editRecipe = db.SelectRecord(id);

        //Populate results to text boxes
        recordID.Text = editRecipe.Recipe_ID.ToString();
        addName.Text = editRecipe.Name;
        addTypeDDL.SelectedValue = editRecipe.Meal;
        addDifficultyDDL.SelectedValue = editRecipe.Difficulty;
        addCookTime.Text = editRecipe.Cook_Time.ToString();
        addDirections.Text = editRecipe.Directions;

        //Change Button Text
        submitRecord.Text = "Edit Record";

        //Change Title Text
        addEditTitle.Text = "Edit Recipe";

    }
}

protected void submitRecord_Click(object sender, EventArgs e) 
{
    Recipe recipe = new Recipe();
    dbCRUD newRecord = new dbCRUD();

    //Variables for execution results
    var modified = "";
    int returned = 0;

    //Creating the recipe Object to pull the values from the form and 
    //send the recipe object as a parameter to the method containing insert stored procedure
    //depending on Add or Edit
    //recipe.Recipe_ID = int.Parse(recordID.Text);
    recipe.Name = addName.Text.ToString();
    recipe.Meal = addTypeDDL.SelectedValue.ToString();
    recipe.Difficulty = addDifficultyDDL.SelectedValue.ToString();
    recipe.Cook_Time = int.Parse(addCookTime.Text);
    recipe.Directions = addDirections.Text.ToString();


    //Checking to see if the page is loaded for edit or new addition
    if (Session["editID"] != null)
    {
        recipe.Recipe_ID = Convert.ToInt32(Session["editID"]);
        //If recordID exists, recipe will be passed to UpdateRecord method
        returned = newRecord.UpdateRecord(recipe);
        modified = "has been edited.";
        Session.Remove("editID");
    }
    else
    {
        //If recordID does not exist, record will be passed to InsertRecord method (new recipe)
        returned = newRecord.InsertRecord(recipe);
        modified = "added";
    }

    //Method returns 0 if successful, 1 if sql error, 2 if other error
    if (returned == 1)
    {
        resultOutput.Text = "There was an sql exception";
        resultOutput.Visible = true;
    }
    else if (returned == 2)
    {
        resultOutput.Text = "There was a non sql exception";
        resultOutput.Visible = true;
    }
    else
    {
        resultOutput.Text = "\"" + addName.Text + "\" recipe " + modified;
        resultOutput.Visible = true;
    }
}

传递给我的编辑方法的任何对象都是成功的,但是,正如我所提到的,它不会获取新更新的文本框值。

【问题讨论】:

  • 那么,页面重新加载时会调用db.SelectRecord(id); 吗?

标签: c# asp.net


【解决方案1】:

您是否尝试检查PostBack 属性,每次回发页面时,您的代码都会加载数据。因此,当您更新表单中的值并点击更新按钮时。 Page_Load 方法首先被调用,它重新加载所有数据(替换表单上的更新值),然后点击更新按钮事件处理程序。所以每次你的旧值都被保存了。

您可以从 page_load 方法中删除代码并将其放在您设置 Session["EditId"] 值的位置。这将解决您的问题。

【讨论】:

  • 你明白了!愚蠢的错误,但是是的 - 我将所有在页面加载上触发的代码放入 if(!IsPostBack){} 控制语句中,一切都很好!
【解决方案2】:

我建议使用静态数据集并将其绑定到 gridview 控件的记录源。每当您想编辑记录时,同时更新数据集并将其重新绑定到 gridview 控件....希望对您有所帮助:)

【讨论】:

  • 感谢 Irfan 的提示。我将尝试上面发布的其他方法,因为它需要的代码更改最少,但如果我无法获得预期的结果,我将使用静态数据集选项。
猜你喜欢
  • 2013-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-19
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
相关资源
最近更新 更多