Этикетки удалены из этого. Контроли продолжают появляться - PullRequest
1 голос
/ 06 июля 2011

Я начинающий C# программист, пытаюсь создать простую RSS/Atom агрегаторную веб-часть для сайта SharePoint (я не могу использовать часть ootb, так как у меня нет лицензии Enterprise).

У меня есть 3 кнопки:

  1. Новый канал, который получает от пользователя URI и пытается создать метку, отображающую канал, и добавить ее к this.Controls;
  2. Очистить каналы, который очищает все отображаемые каналы (удаляя их из this.Controls)
  3. Стандартные каналы, которые принимают ArrayList по умолчанию URIs и преобразуют их каждый в метки (также добавляя их в this.Controls).

Очистка каналов работает нормально, как и возврат к значениям по умолчанию. Однако после очистки всех каналов и попытки добавить новый канал также добавляются значения по умолчанию (и одновременно может быть добавлен только один новый канал, новый перезаписывает старый). Я подозреваю, что это потому, что я не совсем понимаю функцию добавления / удаления элементов управления. Код следует ниже:

    ArrayList viewedFeeds = new ArrayList(); 
    ArrayList defaultFeeds = new ArrayList(); //Contains several default feeds, e.g. BBC news (http://feeds.bbci.co.uk/news/rss.xml)

    private void newFeed_Click(object sender, EventArgs e)
    {
        renderFeed(userText.Text);
    }

    private void clearFeeds_Click(object sender, EventArgs e)
    {
        clearAllFeeds();
    }

    private void defaultFeeds_Click(object sender, EventArgs e)
    {
        clearAllFeeds();
        initialiseFeedViewer();
    }

    private void clearAllFeeds()
    {
        foreach (Label feed in viewedFeeds)
        {
            this.Controls.Remove(feed);
        }
        viewedFeeds.Clear();
    }

    private void initialiseFeedViewer()
    {
        foreach (string uri in defaultFeeds)
            renderFeed(uri);
    }

    private void renderFeed(String uri)  
    {
        try  
        {  
            Label feed = new Label();

            // Create a Syndicated feed reader, parse the XML and add the relevant text to the label "feed"
            feed.BorderStyle = System.Web.UI.WebControls.BorderStyle.Double;
            viewedFeeds.Add(feed);
            this.Controls.Add(feed);
        }
        catch (Exception ex)
        {   
            //Print an error message (e.g. If the URI does not link to a suitable feed
        }
    }

Ответы [ 2 ]

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

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

Это имеет неприятный побочный эффект очистки всех моих переменных, поэтому List<Label> s, которые я использую для отслеживания отображаемых каналов, оказываются бесполезными.

Я попытаюсь обойти это, сохранив их в списке Sharepoint.

0 голосов
/ 06 июля 2011

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

private void renderFeed(String uri)  
{
    try  
    {  
        Label feed = new Label();
        feed.Name = uri;
        //Create a Syndicated feed reader, parse the XML and add the relevant text to the label "feed"
        feed.BorderStyle = System.Web.UI.WebControls.BorderStyle.Double;
        viewedFeeds.Add(uri);
        this.Controls.Add(feed);
    }
    catch (Exception ex)
    {   
        //Print an error message (e.g. If the URI does not link to a suitable feed
    }
}

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

Так же, как sidenote, arraylist считается обесцененным. Попробуйте вместо этого использовать List.

List<string> viewedFeeds = new List<string>();
List<string> defaultFeeds = new List<string>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...