2011-04-26 138 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];    
    }    
} 

`