2011-07-06 1 views
1

SharePointサイトの単純なRSS/Atomアグリゲータwebpart(私はエンタープライズライセンスを持っていないため、ootbの部分は使用できません)を作成しようとしているのは初心者C#です。ラベルがこれから削除されました.Controlsが再び現れます

私は3つのボタンがあります。

  1. ユーザーからURIを受け取り、フィードを表示するラベルを構築し、すべてが表示されたクリアthis.Controls;
  2. クリアフィードにそれを追加しようとした新しいフィードを、デフォルトのフィードのArrayListをデフォルトのURIsに設定し、それぞれをラベルに変換します(this.Controlsから削除します)。this.Controlsにも追加します。

フィードをクリアすると、デフォルトに戻っているようにうまくいきます。ただし、すべてのフィードをクリアして新しいフィードを追加しようとすると、デフォルトが追加されます(一度に1つの新しいフィードしか追加できません。新しいものは古いものを上書きします)。私はこれが、コントロールの追加/削除機能を完全に理解していないためだと思う。以下のコードは、次のとおりです。

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 
     } 
    } 

答えて

1

それは私が回initialiseFeedViewer()多くを呼んでいた判明 - それはcreateChildControls()方法にありました。私はこれがコンストラクタと同様に一度だけ呼び出されたと仮定しましたが、ページが読み込まれるたびに呼び出されるようです。

これは私の変数のすべてをクリアするという厄介な副作用があるため、表示されたフィードを追跡するために使用しているList<Label>は役に立ちません。

私は代わりにSharepoint Listに保存することでこれを回避しようとします。

0

について一度に複数のコントロールを追加することができないという問題です。 arraylistに追加する前に、ラベルの "Name"プロパティを設定してください。ラベルコントロールを保持するために使用している "panel"。

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()を呼び出さないようにしています。

脇役のように、arraylistは償却されているとみなされます。代わりにListを使用することを検討します。

List<string> viewedFeeds = new List<string>(); 
List<string> defaultFeeds = new List<string>(); 
+0

'Label'に' Name'プロパティがないようです。これは 'WebControl.Label'ですか? 'ArrayList'についての頭のおかげで、私は' Java'モードで立ち往生しました – Landric

+0

また、Visual Studioの呼び出し階層を調べると、 'initialiseFeedViewer()'には2回の呼び出ししかありません。プログラムの開始と、「デフォルトのフィード」ボタンがクリックされたときのものである。 – Landric

+0

ええと、label.Nameの代わりにlabel.IDを試してください – Odnxe

関連する問題