ASP.NET ListView SQLDataSource

Я использую Visual Studio 2015 с веб-приложением WebForm. Я добавил ListView и SQLDataSource. SQLDataSource подключен к SQL-серверу.

Использование операций ListView, таких как Edit, Insert и Delete, работает.

У меня есть текстовое поле, в котором пользователь может ввести название города и нажать кнопку, которая обновит SQLDataSource с помощью SQL-запроса. С помощью этого я могу искать/фильтровать названия городов. Это работает.

Но если я нажму кнопку «Изменить» после поиска, результат поиска в списке будет удален, и все записи будут отображаться. Поэтому я не могу использовать «редактирование» после того, как я выполнил поиск.

Как запустить поиск и отредактировать одну из найденных записей в ListView?

введите здесь описание изображения

.apsx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="frmMain.aspx.cs" Inherits="DB_mit_GridView.frmMain" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>

        <asp:Label ID="Label1" runat="server" Text="Stadt"></asp:Label>
        <asp:TextBox ID="txtCity" runat="server"></asp:TextBox>
        <asp:Button ID="btnSearch" runat="server" OnClick="btnSearch_Click" Text="Suche" />

    </div>
        <asp:GridView ID="GridViewDatenAnzeigen" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="CustomerID" DataSourceID="SqlDataSource1" PageSize="5">
            <Columns>
                <asp:CommandField ShowSelectButton="True" />
                <asp:BoundField DataField="CustomerID" HeaderText="CustomerID" ReadOnly="True" SortExpression="CustomerID" />
                <asp:BoundField DataField="CustomerName" HeaderText="CustomerName" SortExpression="CustomerName" />
                <asp:BoundField DataField="City" HeaderText="City" SortExpression="City" />
                <asp:BoundField DataField="PostalCode" HeaderText="PostalCode" SortExpression="PostalCode" />
                <asp:BoundField DataField="Country" HeaderText="Country" SortExpression="Country" />
            </Columns>
        </asp:GridView>
        <br />
        <asp:ListView ID="ListView1" runat="server" DataKeyNames="CustomerID" DataSourceID="SqlDataSource1" OnSelectedIndexChanged="ListView1_SelectedIndexChanged" InsertItemPosition="LastItem">
            <AlternatingItemTemplate>
                <tr style="">
                    <td>
                        <asp:Button ID="DeleteButton" runat="server" CommandName="Delete" Text="Delete" />
                        <asp:Button ID="EditButton" runat="server" CommandName="Edit" Text="Edit" />
                    </td>
                    <td>
                        <asp:Label ID="CustomerIDLabel" runat="server" Text='<%# Eval("CustomerID") %>' />
                    </td>
                    <td>
                        <asp:Label ID="CustomerNameLabel" runat="server" Text='<%# Eval("CustomerName") %>' />
                    </td>
                    <td>
                        <asp:Label ID="CityLabel" runat="server" Text='<%# Eval("City") %>' />
                    </td>
                    <td>
                        <asp:Label ID="PostalCodeLabel" runat="server" Text='<%# Eval("PostalCode") %>' />
                    </td>
                    <td>
                        <asp:Label ID="CountryLabel" runat="server" Text='<%# Eval("Country") %>' />
                    </td>
                </tr>
            </AlternatingItemTemplate>
            <EditItemTemplate>
                <tr style="">
                    <td>
                        <asp:Button ID="UpdateButton" runat="server" CommandName="Update" Text="Update" />
                        <asp:Button ID="CancelButton" runat="server" CommandName="Cancel" Text="Cancel" />
                    </td>
                    <td>
                        <asp:Label ID="CustomerIDLabel1" runat="server" Text='<%# Eval("CustomerID") %>' />
                    </td>
                    <td>
                        <asp:TextBox ID="CustomerNameTextBox" runat="server" Text='<%# Bind("CustomerName") %>' />
                    </td>
                    <td>
                        <asp:TextBox ID="CityTextBox" runat="server" Text='<%# Bind("City") %>' />
                    </td>
                    <td>
                        <asp:TextBox ID="PostalCodeTextBox" runat="server" Text='<%# Bind("PostalCode") %>' />
                    </td>
                    <td>
                        <asp:TextBox ID="CountryTextBox" runat="server" Text='<%# Bind("Country") %>' />
                    </td>
                </tr>
            </EditItemTemplate>
            <EmptyDataTemplate>
                <table runat="server" style="">
                    <tr>
                        <td>No data was returned.</td>
                    </tr>
                </table>
            </EmptyDataTemplate>
            <InsertItemTemplate>
                <tr style="">
                    <td>
                        <asp:Button ID="InsertButton" runat="server" CommandName="Insert" Text="Insert" />
                        <asp:Button ID="CancelButton" runat="server" CommandName="Cancel" Text="Clear" />
                    </td>
                    <td>
                        <asp:TextBox ID="CustomerIDTextBox" runat="server" Text='<%# Bind("CustomerID") %>' />
                    </td>
                    <td>
                        <asp:TextBox ID="CustomerNameTextBox" runat="server" Text='<%# Bind("CustomerName") %>' />
                    </td>
                    <td>
                        <asp:TextBox ID="CityTextBox" runat="server" Text='<%# Bind("City") %>' />
                    </td>
                    <td>
                        <asp:TextBox ID="PostalCodeTextBox" runat="server" Text='<%# Bind("PostalCode") %>' />
                    </td>
                    <td>
                        <asp:TextBox ID="CountryTextBox" runat="server" Text='<%# Bind("Country") %>' />
                    </td>
                </tr>
            </InsertItemTemplate>
            <ItemTemplate>
                <tr style="">
                    <td>
                        <asp:Button ID="DeleteButton" runat="server" CommandName="Delete" Text="Delete" />
                        <asp:Button ID="EditButton" runat="server" CommandName="Edit" Text="Edit" />
                    </td>
                    <td>
                        <asp:Label ID="CustomerIDLabel" runat="server" Text='<%# Eval("CustomerID") %>' />
                    </td>
                    <td>
                        <asp:Label ID="CustomerNameLabel" runat="server" Text='<%# Eval("CustomerName") %>' />
                    </td>
                    <td>
                        <asp:Label ID="CityLabel" runat="server" Text='<%# Eval("City") %>' />
                    </td>
                    <td>
                        <asp:Label ID="PostalCodeLabel" runat="server" Text='<%# Eval("PostalCode") %>' />
                    </td>

                    <td>
                        <asp:Label ID="CountryLabel" runat="server" Text='<%# Eval("Country") %>' />
                    </td>

                </tr>
            </ItemTemplate>
            <LayoutTemplate>
                <table runat="server">
                    <tr runat="server">
                        <td runat="server">
                            <table id="itemPlaceholderContainer" runat="server" border="0" style="">
                                <tr runat="server" style="">
                                    <th runat="server"></th>
                                    <th runat="server">CustomerID</th>
                                    <th runat="server">CustomerName</th>
                                    <th runat="server">City</th>
                                    <th runat="server">PostalCode</th>
                                    <th runat="server">Country</th>
                                </tr>
                                <tr id="itemPlaceholder" runat="server">
                                </tr>
                            </table>
                        </td>
                    </tr>
                    <tr runat="server">
                        <td runat="server" style="">
                            <asp:DataPager ID="DataPager1" runat="server" >
                                <Fields>
                                    <asp:NextPreviousPagerField ButtonType="Button" ShowFirstPageButton="True" ShowNextPageButton="False" ShowPreviousPageButton="False"  />
                                    <asp:NumericPagerField />
                                    <asp:NextPreviousPagerField ButtonType="Button" ShowLastPageButton="True" ShowNextPageButton="False" ShowPreviousPageButton="False" />
                                </Fields>
                            </asp:DataPager>
                        </td>
                    </tr>
                </table>
            </LayoutTemplate>
            <SelectedItemTemplate>
                <tr style="">

                    <td>
                        <asp:Button ID="DeleteButton" runat="server" CommandName="Delete" Text="Delete" />
                        <asp:Button ID="EditButton" runat="server" CommandName="Edit" Text="Edit" />
                    </td>
                    <td>
                        <asp:Label ID="CustomerIDLabel" runat="server" Text='<%# Eval("CustomerID") %>' />
                    </td>
                    <td>
                        <asp:Label ID="CustomerNameLabel" runat="server" Text='<%# Eval("CustomerName") %>' />
                    </td>
                    <td>
                        <asp:Label ID="CityLabel" runat="server" Text='<%# Eval("City") %>' />
                    </td>
                    <td>
                        <asp:Label ID="PostalCodeLabel" runat="server" Text='<%# Eval("PostalCode") %>' />
                    </td>
                    <td>
                        <asp:Label ID="CountryLabel" runat="server" Text='<%# Eval("Country") %>' />
                    </td>
                </tr>
            </SelectedItemTemplate>
        </asp:ListView>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:TestDBConnectionString %>" SelectCommand="SELECT * FROM [Customers]" DeleteCommand="DELETE FROM [Customers] WHERE [CustomerID] = @original_CustomerID" InsertCommand="INSERT INTO [Customers] ([CustomerID], [CustomerName], [City], [PostalCode], [Country]) VALUES (@CustomerID, @CustomerName, @City, @PostalCode, @Country)" OldValuesParameterFormatString="original_{0}" UpdateCommand="UPDATE [Customers] SET [CustomerName] = @CustomerName, [City] = @City, [PostalCode] = @PostalCode, [Country] = @Country WHERE [CustomerID] = @original_CustomerID">
            <DeleteParameters>
                <asp:Parameter Name="original_CustomerID" Type="String" />
            </DeleteParameters>
            <InsertParameters>
                <asp:Parameter Name="CustomerID" Type="String" />
                <asp:Parameter Name="CustomerName" Type="String" />
                <asp:Parameter Name="City" Type="String" />
                <asp:Parameter Name="PostalCode" Type="String" />
                <asp:Parameter Name="Country" Type="String" />
            </InsertParameters>
            <UpdateParameters>
                <asp:Parameter Name="CustomerName" Type="String" />
                <asp:Parameter Name="City" Type="String" />
                <asp:Parameter Name="PostalCode" Type="String" />
                <asp:Parameter Name="Country" Type="String" />
                <asp:Parameter Name="original_CustomerID" Type="String" />
            </UpdateParameters>
        </asp:SqlDataSource>
        <br />
    </form>
</body>
</html>

.aspx.cs

public partial class frmMain : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void btnSearch_Click(object sender, EventArgs e)
        {

            //Search is done here

            SqlDataSource1.SelectCommand = "SELECT* FROM[Customers] where City = '" + txtCity.Text +"'";


        }

        protected void ListView1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }
    }

person Spacewalker    schedule 09.06.2016    source источник
comment
где ваш список впервые заполнен всеми данными? пожалуйста, поделитесь кодом события загрузки страницы   -  person Nazir Ullah    schedule 09.06.2016
comment
listview заполняется автоматически при запуске приложения. Я не добавлял никакого кода. событие page_load пусто   -  person Spacewalker    schedule 09.06.2016
comment
Я не добавляю код, но в SQLDataSource есть SQLQueryProperty: SELECT * FROM [Customers]   -  person Spacewalker    schedule 09.06.2016
comment
вы можете поделиться кодом просмотра списка и тем, как вы ищете, снова заполняется вся страница с помощью кнопки редактирования   -  person Nazir Ullah    schedule 09.06.2016
comment
я выложил код   -  person Spacewalker    schedule 09.06.2016
comment
пожалуйста, проверьте мой ответ, он работает отлично   -  person Nazir Ullah    schedule 09.06.2016
comment
пожалуйста, примите ответ, если это полезно   -  person Nazir Ullah    schedule 09.06.2016
comment
Я получаю сообщение об ошибке Необходимо объявить скалярную переменную @City. У меня есть текстовое поле txtCity, где пользователь вводит название города. Затем пользователь должен нажать кнопку «Поиск» (btnSearch) С помощью SelectCommand = SELECT * FROM [Customers] WHERE City = @txtCity Я получаю ту же ошибку.   -  person Spacewalker    schedule 09.06.2016
comment
также добавьте это ‹SelectParameters› ‹asp:ControlParameter ControlID=txtCity Name=City PropertyName=Text Type=String DefaultValue=% /› ‹/SelectParameters›   -  person Nazir Ullah    schedule 09.06.2016
comment
пожалуйста, внимательно ознакомьтесь с приведенным ниже ответом, скопируйте весь этот источник данных и замените его самостоятельно   -  person Nazir Ullah    schedule 09.06.2016
comment
OK. Я пропустил тег ‹SelectParameter›   -  person Spacewalker    schedule 09.06.2016


Ответы (1)


просто измените команду выбора источника данных и добавьте параметр выбора

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:TestDBConnectionString %>" SelectCommand="SELECT * FROM [Customers] WHERE City LiKE @City + '%'" DeleteCommand="DELETE FROM [Customers] WHERE [CustomerID] = @original_CustomerID" InsertCommand="INSERT INTO [Customers] ([CustomerID], [CustomerName], [City], [PostalCode], [Country]) VALUES (@CustomerID, @CustomerName, @City, @PostalCode, @Country)" OldValuesParameterFormatString="original_{0}" UpdateCommand="UPDATE [Customers] SET [CustomerName] = @CustomerName, [City] = @City, [PostalCode] = @PostalCode, [Country] = @Country WHERE [CustomerID] = @original_CustomerID">
            <DeleteParameters>
                <asp:Parameter Name="original_CustomerID" Type="String" />
            </DeleteParameters>
  <SelectParameters>
   <asp:ControlParameter ControlID="txtCity" Name="City" PropertyName="Text" Type="String" DefaultValue="%" />
     </SelectParameters>
            <InsertParameters>
                <asp:Parameter Name="CustomerID" Type="String" />
                <asp:Parameter Name="CustomerName" Type="String" />
                <asp:Parameter Name="City" Type="String" />
                <asp:Parameter Name="PostalCode" Type="String" />
                <asp:Parameter Name="Country" Type="String" />
            </InsertParameters>
            <UpdateParameters>
                <asp:Parameter Name="CustomerName" Type="String" />
                <asp:Parameter Name="City" Type="String" />
                <asp:Parameter Name="PostalCode" Type="String" />
                <asp:Parameter Name="Country" Type="String" />
                <asp:Parameter Name="original_CustomerID" Type="String" />
            </UpdateParameters>
        </asp:SqlDataSource>

и после этого удалите код, стоящий за запросом выбора

 protected void btnSearch_Click(object sender, EventArgs e)
        {

            //Search is done here

         //   SqlDataSource1.SelectCommand = "SELECT* FROM[Customers] where City = '" + txtCity.Text +"'";


        }
person Nazir Ullah    schedule 09.06.2016