2011-04-26 130 views
3

插入新項目後需要進入編輯模式。在FormView插入後獲取返回值

OnItemInserted梅託德:

protected void fvReport_ItemInserted(Object sender, FormViewInsertedEventArgs e) 
    { 
     if (e.Exception == null) 
     { 
      if (Session["id"] != null) 
      { 
       ObjectReport.SelectParameters["id"].DefaultValue = Session["id"].ToString(); 
      } 
      fvReport.ChangeMode(FormViewMode.ReadOnly); 
     } 
    } 

ObjectDataSource控件:

<asp:ObjectDataSource ID="ObjectReport" runat="server" 
    TypeName = "ObjectDataSources.CS.ConnectionToDB" 
    SelectMethod = "GetReportById" InsertMethod="InsertReport" OnInserted="ObjectReport_Inserted"> 
    <SelectParameters> 
      <asp:Parameter Name="id" Type = "Int32" /> 
    </SelectParameters> 
    <InsertParameters> 
      <asp:Parameter Name="id" Type="Int32" Direction="Output" /> 
      <asp:Parameter Name="report_name" Type="String" /> 
      <asp:Parameter Name="customer" Type="String" ConvertEmptyStringToNull="true" /> 
      <asp:Parameter Name="assignment" Type="String" ConvertEmptyStringToNull="true" /> 
      <asp:Parameter Name="report_type" Type="String" ConvertEmptyStringToNull="true" /> 
      <asp:Parameter Name="system" Type="String" ConvertEmptyStringToNull="true" /> 
      <asp:Parameter Name="setting" Type="String" ConvertEmptyStringToNull="true" /> 
    </InsertParameters> 
</asp:ObjectDataSource> 

protected void ObjectReport_Inserted(object sender, ObjectDataSourceStatusEventArgs e) 
{ 
    Session["id"] = e.OutputParameters["id"].ToString(); 
} 

InsertMetod:

public void InsertReport(out int id, string report_name, 
    string customer, string assignment, 
    string report_type, string system, string setting) 
{ 
    SqlConnection conn = new SqlConnection(_connectionString); 
    SqlCommand cmd = new SqlCommand("INSERT INTO main_report ("report_name,customer,assignment,report_type, " + 
    "system,setting) VALUES ("@report_name,@customer,@assignment, " + 
    "@report_type,@system,@setting); " + 
    "SELECT @id = SCOPE_IDENTITY() ", conn); 
    cmd.Parameters.Add("@report_name", SqlDbType.VarChar, 255).Value = report_name; 
    cmd.Parameters.Add("@customer", SqlDbType.VarChar, 255).Value = customer; 
    cmd.Parameters.Add("@assignment", SqlDbType.VarChar, 255).Value = assignment; 
    cmd.Parameters.Add("@report_type", SqlDbType.VarChar, 50).Value = report_type; 
    cmd.Parameters.Add("@system", SqlDbType.VarChar, 3).Value = system; 
    cmd.Parameters.Add("@setting", SqlDbType.VarChar, 255).Value = setting; 
    SqlParameter p = cmd.Parameters.Add("@id", SqlDbType.Int); 
    p.Direction = ParameterDirection.Output; 
    id = 0; 
    conn.Open(); 
    cmd.ExecuteNonQuery(); 
    id = (int)p.Value; 
    conn.Close(); 

}

當我嘗試插入,我收到一個異常:

Session["id"] = e.OutputParameters["id"].ToString(); - Object reference not set to an instance of an object. 

爲什麼OutputParameter爲null?我究竟做錯了什麼?

回答

1

你可以從你的方法返回的值,並可以訪問它像...

public Int InsertReport(............) 
{ 
.... 
.... 
return Id 
} 

然後在插入功能,您可以通過e.ReturnValue

Session["id"] = Convert.ToString(e.ReturnValue); 
+0

穆罕默德·阿赫塔爾,謝謝! – DmitryB 2011-04-26 16:12:23

+0

只有FormViewInsertedEventArgs沒有「ReturnValue」屬性。 – Ghaag 2016-07-09 21:23:44

1

只要插入訪問在formview插入事件中的一個項目,你可以獲取你插入的值。剛剛插入formview後只會在只讀模式進入綁定主鍵。所以你需要分配你的數據源可以在選擇事件中使用的主鍵。

在下面的代碼示例中,您可以在插入時獲取formview中發佈的所有數據。只需獲取KeyValPair [0,1]中可以獲得的主鍵數據。在這裏,我將這個值賦給我的本地頁面級變量RTCD,我用它來綁定並再次在formview的只讀模式下顯示完整的記錄。

我在選擇時使用這個RTCD。 注意 - 這種情況只有在您從前端輸入主鍵數據時才起作用,因爲您需要從後端捕獲新生成的ID,然後在此iteminserted事件中分配以讓formview綁定它並在讀取時顯示完整記錄只有模式。

protected void odsDepRt_Selecting(object sender, ObjectDataSourceSelectingEventArgs e) 
{ 
    e.InputParameters[0] = RTCD; 
} 



protected void frmDepRt_ItemInserted(object sender, FormViewInsertedEventArgs e) 
{ 
    if (e.Exception != null) 
    { 
     lblErr.Text = ErrHandler.HandleDataErr(e.Exception.InnerException, "", false).ToString().Trim(); 
     e.ExceptionHandled = true; 
     e.KeepInInsertMode = true; 
    } 
    else 
    { 
     IEnumerator ValEnum = e.Values.GetEnumerator(); 
     string[,] KeyValPair=new string[3,2]; 
     int i = 0; 
     while(ValEnum.MoveNext()) //Till not finished do print 
     { 
      KeyValPair[i,0]= ((DictionaryEntry)ValEnum.Current).Key.ToString(); 
      KeyValPair[i, 1] = ((DictionaryEntry)ValEnum.Current).Value.ToString(); 
      i++; 
     } 
     RTCD = KeyValPair[0, 1];    
    }    
} 

`