2014-01-22 56 views
0

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

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

传递给我的编辑方法的对象是成功的,但是,正如我所说,它不会抢新更新的文本框中的值。

+0

那么,是'db.SelectRecord(id);'在页面重新加载时调用? – Jodrell

回答

1

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

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

+0

你懂了!愚蠢的错误,但是 - 我把所有的代码放在页面加载到if(!IsPostBack){}控制语句,一切都很好! –

1

我会建议使用静态数据集并将其绑定到gridview控件的记录源。每当你想编辑一个记录同时更新数据集并重新绑定到gridview控件....希望可以帮助:)

+0

感谢您的提示,Irfan。我将尝试上面发布的其他方法,因为它需要最少量的代码更改,但如果我无法获得预期的结果,我将使用静态数据集选项。 –

相关问题