Получение возвращенного значения после вставки в FormView - PullRequest
3 голосов
/ 26 апреля 2011

Мне нужно перейти в режим редактирования после вставки нового элемента.

Метод 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?Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 13 июля 2011

Всякий раз, когда вы вставляете элемент в событие вставки формы, вы можете получить значения, которые вы опубликовали для вставки.Что происходит, что сразу после вставки formview переходит в режим только для чтения, чтобы быть связанным с первичным ключом.Поэтому вам нужно назначить тот первичный ключ, который ваш источник данных может использовать в событии выбора.

В приведенном ниже примере кода вы можете получить все данные, опубликованные в форме просмотра во время вставки.Просто извлеките данные первичного ключа, которые вы можете получить, я думаю, в KeyValPair [0, 1].Здесь я присваиваю это значение моей локальной переменной уровня страницы RTCD, которую я использую для привязки и снова отображаю полную запись в режиме только для чтения формы.

Я использую этот RTCD во время выбора.NB. Этот сценарий вступает в действие только тогда, когда вы вводите данные первичного ключа из внешнего интерфейса, поскольку вновь созданный идентификатор необходимо захватить из внутреннего интерфейса, а затем назначить в этом событии iteminserted, чтобы позволить виду формы связать его и показать полную запись только для чтения.режим.

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

`

1 голос
/ 26 апреля 2011

Вы можете вернуть значение из вашего метода и получить к нему доступ как ...

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

И затем во вставленной функции вы можете получить к ней доступ e.ReturnValue

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