Код сортировки Listview явно мешает коду обработки элемента - PullRequest
0 голосов
/ 22 ноября 2011

Запуск VWD 2010 Express на компьютере с Windows 7.

У меня есть asp: listview (на вкладке), в котором есть заголовки столбцов, которые сортируют данные (без кода с моей стороны). Эта часть работает, когда она сама по себе. Но происходит сбой, когда я пытаюсь вставить код для поддержки элементов в списке. Итак, вот что я имею:

(1) Я могу отсортировать элементы в списке, щелкнув заголовок (в данном случае «заголовок») asp: ListView предоставляет механизм для сортировки списка, нажав на заголовок без использования кода позади. Мы можем сделать это с помощью кнопки следующим образом:

<asp:Button runat="server" ID="SortTitle" Text="Title" CommandName="Sort"  CommandArgument="sTitle"   />

Нет кода позади. Этот заголовок находится в заголовке, который находится за пределами шаблона элемента. Работает нормально. Я могу сортировать списки по возрастанию и по убыванию в душе, нажав на соответствующий заголовок. Это хорошо, но я также хотел бы, чтобы программа «что-то делала» при нажатии на элемент списка.

(2) Я могу заставить что-то произойти, когда нажимаю на элемент в списке. К счастью, существует механизм управления тем, что происходит, когда элемент щелкается в списке с помощью атрибута OnItemCommand в теге asp: ListView.

<asp:ListView runat="server" ID="lvWebsites" DataSourceID="websiteSuggestionsDataSource" OnItemCommand="lv_website_click"  >

Это работает так себе. Он делает то, что я хочу, но он перезагружает страницу (что я не хочу делать). Это отдельная проблема, и я могу открыть другой вопрос по этому вопросу. Главное, что я могу нажать на элемент в списке, и он выполняет некоторый код позади.

Настоящая проблема возникает, когда я использую (1) и (2) вместе. Когда я это делаю, он игнорирует CommandName = "Sort" в теге кнопки и выполняет код позади (lv_website_click) независимо от того, нажимаю ли я на заголовок (заголовок) или на фактический элемент в списке. Как будто система не делает различий между заголовком в просмотре списка и действительным элементом списка в просмотре списка.

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

<div id='tab-container'>

    <div class="tab-content" style="width:1000px">
            <h1 class="tab" title="Feedback on the site">Site Feedback</h1>
            <asp:ListView runat="server" ID="anID"
                DataSourceID="mydatasource"
                OnItemCommand="lv_website_click"  >

                <LayoutTemplate>
                <table    id="table1" style="background-color:White;border-collapse:collapse;" width="100%">
                    <tr style="background-color:White">
                        <td  width="75%">
                        <asp:Button runat="server" ID="SortTitle" 
                          Text="Title" CommandName="Sort"  CommandArgument="sTitle"   /></td>
                        <td>    <asp:Button runat="server" ID="LinkButton1" 
                          Text="Posted" CommandName="Sort" CommandArgument="sDate"   /></td>
                        <td>     <asp:Button runat="server" ID="SortDate" 
                          Text="Status" CommandName="Sort" CommandArgument="sStatus" /></td>
                    </tr>
                    <tr runat="server" id="itemPlaceholder">
                    </tr> 
                </table>
                <asp:DataPager runat="server" ID="datapagerSites" PageSize="10" style="background-color:White" enableviewstate="false"
                PagedControlID="lvWebsites"  >
                    <Fields>
                      <asp:TemplatePagerField>              
                        <PagerTemplate>
                        <b>
                        Page
                        <asp:Label runat="server" ID="CurrentPageLabel" 
                          Text="<%# Container.TotalRowCount>0 ? (Container.StartRowIndex / Container.PageSize) + 1 : 0 %>" />
                        of
                        <asp:Label runat="server" ID="TotalPagesLabel" 
                          Text="<%# Math.Ceiling ((double)Container.TotalRowCount / Container.PageSize) %>" />
                        (
                        <asp:Label runat="server" ID="TotalItemsLabel" 
                          Text="<%# Container.TotalRowCount%>" />
                        records)
                        <br />
                        </b>
                        </PagerTemplate>
                      </asp:TemplatePagerField>

                      <asp:NextPreviousPagerField
                        ButtonType="Button"
                        ShowFirstPageButton="true"
                        ShowNextPageButton="false"
                        ShowPreviousPageButton="false" />

                      <asp:NumericPagerField 
                        PreviousPageText="&lt; Prev 10"
                        NextPageText="Next 10 &gt;"
                        ButtonCount="10" />

                      <asp:NextPreviousPagerField
                        ButtonType="Button"
                        ShowLastPageButton="true"
                        ShowNextPageButton="false"
                        ShowPreviousPageButton="false" />


                    </Fields>
                </asp:DataPager>
                </LayoutTemplate>
                <ItemTemplate>
                <tr id="Tr1" runat="server" style="background-color:#ECE5B6;" >
                    <td><asp:Button  BackColor="#ECE5B6" CommandName="lcommand" runat="server" ID="Title"   Text='<%# Eval("sTitle")%>'   CommandArgument='<%# Eval("sID") %>' /></td>
                    <td><asp:Label runat="server" ID="Label1"  Text='<%# Eval("posted")%>'  /></td>
                    <td><asp:Label runat="server" ID="Status"  Text='<%# Eval("sStatus")%>' /></td>
                </tr>
                </ItemTemplate>
                <AlternatingItemTemplate>
                <tr id="Tr1" runat="server" style="background-color:#FAF8CC;" >
                    <td><asp:Button BackColor="#FAF8CC" CommandName="lcommand" runat="server" ID="Title"   Text='<%# Eval("sTitle")%>'  CommandArgument='<%# Eval("sID") %>' /></td>
                    <td><asp:Label runat="server" ID="Label1"  Text='<%# Eval("posted")%>'  /></td>
                    <td><asp:Label runat="server" ID="Status"  Text='<%# Eval("sStatus")%>' /></td>
                </tr>

                </AlternatingItemTemplate>
            </asp:ListView>
    </div>
</div>

Мне кажется, что я мог бы сделать обе вещи в своем собственном коде для обработки элементов, но мне действительно это не нравится, так как я хотел бы использовать поведение автоматической сортировки, которое я получаю из Listview контроль.

Я бы подумал, что OnItemCommand = "lv_website_click" в теге asp: listview будет применяться к элементам, а CommandName = "Sort" CommandArgument = "sTitle" будет применяться к заголовкам (используемым для сортировки), поскольку они находятся за пределами элемента itemtemplate. Видимо, это не так.

Есть ли способ использовать оба из них (сортировка с помощью щелчка по заголовку и коду для элементов в списке), чтобы они не конфликтовали друг с другом?

1 Ответ

0 голосов
/ 22 ноября 2011

Решение находится в выделенном коде.

защищенный void lv_website_click (отправитель объекта, ListViewCommandEventArgs e) {if (! E.CommandName.Equals ("Sort")) {int searchID = Convert.ToInt32(e.CommandArgument.ToString ());

    TableAdapters.SuggestionsTableAdapter sAdapt =
        new TableAdapters.SuggestionsTableAdapter();

    SuggestionsDataTable tbl = sAdapt.GetDataByID(searchID);

    tbMessage.Text = tbl.Rows[0]["message"].ToString();
    lbField2.Text = tbl.Rows[0]["field2"].ToString();
    lbStuff.Text = tbl.Rows[0]["stuff"].ToString();

    }
}

Ключ - это "если", окружающее тело метода.Если это не событие сортировки (т. Е. CommandName не равно «Сортировать», то делайте все, что вы должны делать, когда щелкаете по элементу. ПРОЧЕЕ, если это сортировка, просто игнорируйте код. Я неправильно понялчто происходило здесь. Я думал, что это игнорирование сортировки и выполнение другого кода независимо от того, что происходило в том, что если CommandName имеет тип Sort, то он выполняет сортировку, но он также выполняет мой код позади (где онбыла ошибка).

То есть проблема была не с aspx (как я думал), а с c # позади.

...