У меня есть элемент управления Asp:ListView, который я показываю во всплывающем окне в веб-форме. В настоящее время он вносит все изменения непосредственно в базу данных, как только я нажимаю кнопки «Вставить», «Обновить» или «Удалить».
Но мне нужно, чтобы все изменения производились в базе данных только при отправке веб-формы.
Итак, я понял, что мне нужно будет хранить данные, которые я привязываю к ListView в сеансе, и во всех операциях вставки, обновления и удаления, делать все изменения вручную в событиях OnInserting, OnDeleting, OnUpdating с помощью
Шаг 1) извлечение данных каждый раз из Session["ListView1"],
Шаг 2) выполнение операций вставки/удаления/обновления извлеченных данных
Шаг 3) привязка их к ListView
Шаг 4) замена данных в Session["ListView1"] после обновления.
Шаг 5) При отправке веб-формы, получении обновленных данных и замене всех в базе данных?
Я сделал эти шаги, но это не работает, как ожидалось. При обновлении ListView отображает пустые значения для 2 столбцов и неправильно привязывает данные. Я связал с правильными столбцами. После вставки текстовое поле не меняется на метки, как ожидалось. Ниже мой ListView и код программной части:
Посмотреть список:
<asp:updatepanel id="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:ListView ID="ListView1" runat="server"
OnItemCanceling="ListView1_ItemCanceling" OnItemEditing="ListView1_ItemEditing"
OnItemDeleting="ListView1_ItemDeleting" OnItemUpdating="ListView1_ItemUpdating"
OnItemInserting="ListView1_ItemInserting" DataKeyNames="Id"
InsertItemPosition="LastItem">
<AlternatingItemTemplate>
<tr style="">
<td width="200">
<asp:LinkButton ClientIDMode="AutoID" ID="DeleteButton" runat="server"
CommandName="Delete" Text="Delete" CausesValidation="false" />
<asp:LinkButton ClientIDMode="AutoID" ID="EditButton" runat="server"
CommandName="Edit" Text="Edit" CausesValidation="false" />
</td>
<td>
<asp:Label ID="IdLabel" runat="server" Text='<%# Eval("Id") %>' />
</td>
<td>
<asp:Label ID="FirstNameLabel" runat="server" Text='<%# Eval("FirstName") %>' />
</td>
<td>
<asp:Label ID="LastNameLabel" runat="server" Text='<%# Eval("LastName") %>' />
</td>
<td>
<asp:Label ID="Column3Label" runat="server" Text='<%# Eval("Column3") %>' />
</td>
<td>
<asp:Label ID="Column4Label" runat="server" Text='<%# Eval("Column4") %>' />
</td>
</tr>
</AlternatingItemTemplate>
<EditItemTemplate>
<tr style="">
<td>
<asp:LinkButton ClientIDMode="AutoID" ID="UpdateButton" runat="server"
CommandName="Update" Text="Update" ValidationGroup="popup1" CausesValidation="true" />
<asp:LinkButton ClientIDMode="AutoID" ID="CancelButton" runat="server"
CommandName="Cancel" Text="Cancel" CausesValidation="false" />
</td>
<td>
<asp:Label ID="IdLabel1" runat="server" Text='<%# Eval("Id") %>' />
</td>
<td>
<asp:TextBox ID="FirstNameTextBox" Style="width: 100px; background-color: white;"
runat="server" Text='<%# Bind("FirstName") %>' CausesValidation="true" />
<asp:RequiredFieldValidator ID="NameReq" runat="server" ControlToValidate="FirstNameTextBox"
ErrorMessage="First name is required." ToolTip="First name is required."
ValidationGroup="popup1">*</asp:RequiredFieldValidator>
</td>
<td>
<asp:TextBox ID="LastNameTextBox" Style="width: 100px; background-color: white;"
runat="server" Text='<%# Bind("LastName") %>' CausesValidation="true" />
<asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server"
ControlToValidate="LastNameTextBox" ErrorMessage="Last name is required."
ToolTip="Last name is required." ValidationGroup="popup1">*</asp:RequiredFieldValidator>
</td>
<td>
<asp:TextBox ID="Column3TextBox" Style="width: 100px; background-color: white;"
runat="server" Text='<%# Bind("Column3") %>' CausesValidation="true" />
<asp:RequiredFieldValidator ID="RequiredFieldValidator6" runat="server"
ControlToValidate="Column3TextBox" ErrorMessage="ID is required." ToolTip="ID is required."
ValidationGroup="popup1">*</asp:RequiredFieldValidator>
</td>
<td>
<asp:TextBox ID="Column4Text" placeholder="mm/dd/yyyy" Style="width: 100px;
background-color: white;" runat="server" Text='<%# Bind("Column4") %>'
CausesValidation="true" />
<asp:RequiredFieldValidator ID="RequiredFieldValidator7" runat="server"
ControlToValidate="Column4Text" ErrorMessage="Date is required."
ToolTip="Date is required." ValidationGroup="popup1">*</asp:RequiredFieldValidator>
</td>
</tr>
<tr>
<td>
<asp:RegularExpressionValidator ID="dateValRegex" runat="server"
ControlToValidate="Column4Text" ErrorMessage="Please Enter a valid date in the format (mm/dd/yyyy)"
ValidationExpression="^(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d$"
ValidationGroup="popup"></asp:RegularExpressionValidator>
</td>
</tr>
</EditItemTemplate>
<EmptyDataTemplate>
<table id="Table1" runat="server" style="">
<tr>
<td>No data was returned.</td>
</tr>
</table>
</EmptyDataTemplate>
<InsertItemTemplate>
<tr>
<td width="200">
<asp:LinkButton ClientIDMode="AutoID" ID="InsertButton" runat="server" CommandName="Insert"
Text="Insert" ValidationGroup="popup" CausesValidation="true" />
<asp:LinkButton ClientIDMode="AutoID" ID="LinkButton1" runat="server" CommandName="Cancel"
Text="Clear" CausesValidation="false" />
</td>
<td>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("Id") %>' />
</td>
<td>
<asp:TextBox ID="TextBox1" Style="width: 100px; background-color: white;" runat="server"
Text='<%# Bind("FirstName") %>' CausesValidation="true" />
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server"
ControlToValidate="FirstNameTextBox" ErrorMessage="First name is required."
ToolTip="First name is required." ValidationGroup="popup">*</asp:RequiredFieldValidator>
</td>
<td>
<asp:TextBox ID="TextBox2" Style="width: 100px; background-color: white;" runat="server"
Text='<%# Bind("LastName") %>' CausesValidation="true" />
<asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server"
ControlToValidate="LastNameTextBox" ErrorMessage="Last name is required."
ToolTip="Last name is required." ValidationGroup="popup">*</asp:RequiredFieldValidator>
</td>
<td>
<asp:TextBox ID="TextBox3" Style="width: 100px; background-color: white;" runat="server"
Text='<%# Bind("Column3") %>' CausesValidation="true" />
<asp:RequiredFieldValidator ID="RequiredFieldValidator4" runat="server"
ControlToValidate="Column3TextBox" ErrorMessage="ID is required."
ToolTip="ID is required." ValidationGroup="popup">*</asp:RequiredFieldValidator>
</td>
<td>
<asp:TextBox ID="TextBox4" placeholder="mm/dd/yyyy" Style="width: 100px;
background-color: white;" runat="server" Text='<%# Bind("Column4") %>' CausesValidation="true" />
<asp:RequiredFieldValidator ID="RequiredFieldValidator5" runat="server" ControlToValidate="Column4Text"
ErrorMessage="Date is required." ToolTip="Date is required."
ValidationGroup="popup">*</asp:RequiredFieldValidator>
</tr>
<tr>
<td>
<asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server"
ControlToValidate="Column4Text" ErrorMessage="Please Enter a valid date in the format (mm/dd/yyyy)"
ValidationExpression="^(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d$"
ValidationGroup="popup"></asp:RegularExpressionValidator>
</td>
</tr>
</InsertItemTemplate>
<ItemTemplate>
<tr>
<td width="200">
<asp:LinkButton ClientIDMode="AutoID" ID="LinkButton2" runat="server" CommandName="Delete"
Text="Delete" CausesValidation="false" />
<asp:LinkButton ClientIDMode="AutoID" ID="LinkButton3" runat="server" CommandName="Edit"
Text="Edit" CausesValidation="false" />
</td>
<td>
<asp:Label ID="Label2" runat="server" Text='<%# Eval("Id") %>' />
</td>
<td>
<asp:Label ID="Label3" runat="server" Text='<%# Eval("FirstName") %>' />
</td>
<td>
<asp:Label ID="Label4" runat="server" Text='<%# Eval("LastName") %>' />
</td>
<td>
<asp:Label ID="Label5" runat="server" Text='<%# Eval("Column3") %>' />
</td>
<td>
<asp:Label ID="Label6" runat="server" Text='<%# Eval("Column4") %>' />
</td>
</tr>
</ItemTemplate>
<LayoutTemplate>
<table id="Table2" runat="server">
<tr id="Tr1" runat="server">
<td id="Td1" runat="server">
<table id="itemPlaceholderContainer" runat="server" border="0" style="">
<tr id="Tr2" runat="server" style="">
<th id="Th1" runat="server">Action</th>
<th id="Th2" runat="server">Id</th>
<th id="Th3" runat="server">First Name</th>
<th id="Th4" runat="server">Last Name</th>
<th id="Th5" runat="server">Column3 Name</th>
<th id="Th6" runat="server">Column4 Name</th>
</tr>
<tr id="itemPlaceholder" runat="server">
</tr>
</table>
</td>
</tr>
</table>
<table width="900" align="center" style="text-align: center;">
<tr id="Tr3" runat="server">
<td id="Td2" runat="server" style="">
<asp:DataPager ID="DataPager1" runat="server">
<Fields>
<asp:NextPreviousPagerField ButtonType="Link" ShowFirstPageButton="True"
ShowNextPageButton="False" ShowPreviousPageButton="False" />
<asp:NumericPagerField />
<asp:NextPreviousPagerField ButtonType="Link" ShowLastPageButton="True"
ShowNextPageButton="False" ShowPreviousPageButton="False" />
</Fields>
</asp:DataPager>
</td>
</tr>
</table>
</LayoutTemplate>
<SelectedItemTemplate>
<tr style="">
<td>
<asp:LinkButton ID="LinkButton4" runat="server" CommandName="Delete" Text="Delete"
CausesValidation="false" />
<asp:LinkButton ID="LinkButton5" runat="server" CommandName="Edit" Text="Edit"
CausesValidation="false" />
</td>
<td>
<asp:Label ID="Label7" runat="server" Text='<%# Eval("Id") %>' />
</td>
<td>
<asp:Label ID="Label8" runat="server" Text='<%# Eval("FirstName") %>' />
</td>
<td>
<asp:Label ID="Label9" runat="server" Text='<%# Eval("LastName") %>' />
</td>
<td>
<asp:Label ID="Label10" runat="server" Text='<%# Eval("Column3") %>' />
</td>
<td>
<asp:Label ID="Label11" runat="server" Text='<%# Eval("Column4") %>' />
</td>
</tr>
</SelectedItemTemplate>
</asp:ListView>
</ContentTemplate>
</asp:updatepanel>
Ниже приведен код программной части:
protected void Page_Load(object sender, EventArgs e)
{
try
{
if (!IsPostBack)
{
LoadListView();
}
}
private void LoadListView()
{
try
{
List lstDetails = Session["ListView1Data"] as List;
ListView1.DataSource = lstDetails;
ListView1.DataBind();
Session["ListView1Data"] = lstDetails ;
}
catch (Exception ex)
{
ExceptionLogger.LogException(ex);
}
}
protected void ListView1_ItemDeleting(object sender, ListViewDeleteEventArgs e)
{
List lstDetails = Session["ListView1Data"] as List;
int id = Convert.ToInt32(e.Values["Id"]);
if (lstDetails.Exists(x => x.Id == id))
{
var tableDetail = lstDetails.Where(x => x.Id == id).FirstOrDefault();
lstDetails.Remove(tableDetail);
hdnListDeleteIds.Value = id + "|";
ListView1.DataSource = lstDetails;
ListView1.DataBind();
ListView1.EditIndex = -1;
}
}
protected void ListView1_ItemUpdating(object sender, ListViewUpdateEventArgs e)
{
List lstDetails = Session["ListView1Data"] as List;
int id = Convert.ToInt32(e.OldValues["Id"]);
if (lstDetails.Exists(x => x.Id == id))
{
var tableDetail = lstDetails.Where(x => x.Id == id).FirstOrDefault();
tableDetail.FirstName = e.NewValues["FirstName"].ToString();
tableDetail.LastName = e.NewValues["LastName"].ToString();
tableDetail.Column3 = e.NewValues["Column3"].ToString();
tableDetail.Column4 = Convert.ToDateTime(e.NewValues["Column4"]);
hdnListUpdateIds.Value = id + "|";
ListView1.DataSource = lstDetails;
ListView1.DataBind();
ListView1.EditIndex = -1;
Session["ListView1Data"] = lstDetails;
}
}
protected void ListView1_ItemInserting(object sender, ListViewInsertEventArgs e)
{
List lstDetails = Session["ListView1Data"] as List;
EntityFrameworkModel.TableDetails tableDetail = new EntityFrameworkModel.TableDetails()
{
FirstName = e.Values["FirstName"].ToString(),
LastName = e.Values["LastName"].ToString(),
Column3 = e.Values["Column3"].ToString(),
Column4 = Convert.ToDateTime(e.Values["Column4"]),
Id = 0
};
lstDetails.Add(tableDetail);
Session["ListView1Data"] = lstDetails;
ListView1.DataSource = lstDetails;
ListView1.DataBind();
ListView1.EditIndex = -1;
}
protected void ListView1_ItemCanceling(object sender, ListViewCancelEventArgs e)
{
List lstDetails = Session["ListView1Data"] as List;
ListView1.DataSource = lstDetails;
ListView1.DataBind();
e.Cancel = true;
ListView1.EditIndex = -1;
}
protected void ListView1_ItemEditing(object sender, ListViewEditEventArgs e)
{
ListView1.EditIndex = e.NewEditIndex;
}
Что я делаю не так? Пожалуйста помоги.
Огромное спасибо