близкие. В настоящее время я бьюсь головой о стену и ищу облегчения!
У меня есть пользователь, создающий новый элемент в базе данных. Пользователь вводит процедуру устранения неполадок (список задач) и очень краткое описание процедуры (примерно 10 слов). Процедура добавляется в базу данных без проблем. Помимо добавления в базу данных, мой код должен отправить администратору электронное письмо с предупреждением о модерации.
Электронное письмо с предупреждением должно содержать имя человека, который его создал (это не проблема) и резюме. Резюме - это то место, где я зацикливаюсь. Я пытаюсь получить его из dataSource.InsertParameters внутри события «ItemInserted», и он становится нулевым.
Вот соответствующая часть DetailsView:
<asp:DetailsView ID="DvProcedures" runat="server" Height="50px" Width="586px"
AutoGenerateRows="False" DataKeyNames="ProcID" DataSourceID="dataDvProcedures"
OnItemUpdated="DvProcedures_ItemUpdated" OnItemInserted="DvProcedures_ItemInserted" OnItemInserting="DvProcedures_ItemInserting">
<Fields>
<!-- other fields are removed from this example to help keep things tiday -->
<asp:TemplateField HeaderText="Summary" SortExpression="Summary">
<InsertItemTemplate>
<asp:TextBox ID="txtProcedureSummary" runat="server" Text='<%# Bind("Summary") %>' Width="586px" CausesValidation="True"></asp:TextBox>
</InsertItemTemplate>
</Fields>
</asp:DetailsView>
Вот соответствующая часть источника данных DetailView:
<asp:SqlDataSource ID="dataDvProcedures" runat="server" ConnectionString="<%$ ConnectionStrings:kbelConnectionString %>"
InsertCommand="INSERT INTO [Procedures]
([PolicyID], [CategoryID], [Summary], [Content], [CreatedBy], [CreatedOn])
VALUES (@PolicyID, @CategoryID, @Summary, @Procedure, @CreatedBy, GETDATE())"
<!-- the remainder of the dataview is removed, so as not to muddy these waters -->
</asp:SqlDataSource>
А вот код для событий «ItemInserted» и «ItemInserting»:
protected void DvProcedures_ItemInserted(object sender, DetailsViewInsertedEventArgs e)
{
// check for database exception and such. then re-bind the gridview
if (e.Exception != null)
{
lblErrorMessage.Text = "A database error has occurred. Message: " + e.Exception.Message;
e.ExceptionHandled = true;
}
else if (e.AffectedRows == 0)
lblErrorMessage.Text = "No error was detected, but procedure could not be added to the database.";
else
{
GvProcedures.DataBind();
}
// send email to admin
this.SendEmailMessage(
AdminEmail,
SmtpServer,
dataDvProcedures.InsertParameters["CreatedBy"].DefaultValue, // works fine, maybe related to manually setting it in DvProcedures_ItemInserting()?
dataDvProcedures.InsertParameters["Summary"].DefaultValue, // comes up null, although it's good in DB
"create");
}
protected void DvProcedures_ItemInserting(object sender, DetailsViewInsertEventArgs e)
{
// set "CreatedBy" attribute for dataview's "insert" command
// TODO: get username programitically
string userName = "dvader";
dataDvProcedures.InsertParameters["CreatedBy"].DefaultValue = userName;
}
Я понятия не имею, как поступить, поэтому любые советы будут приветствоваться.
Спасибо.
Примечание. Я искал SO для этой проблемы и нашел две возможности, ни одна из которых мне не помогла:
1) Получение значения из DataView C#
рекомендация: строковое имя = dataView[index]["Name"] as string; результат: получена ошибка "имя 'индекс' не существует в текущем контексте"
2) Как получить значение из столбца в DataView?
Рекомендация: если у вас есть DataView, а не DataTable, то то же самое работает со строкой DataRowView val = (string)view[rowIndex]["GrossPerPop"];
результат: я не знаю, как создать или использовать DataRowView