2009-03-18 15 views
1

私はDefault.aspxのテーブルにASP.NETのコンテンツが表示されないのはなぜですか?

<asp:Table runat="server" ID="ButtonTable" /> 
<asp:Label runat="server" ID="OutPut" /> 

出力ショーで

GetData Buttons = new GetData();//create a reference to the class 
ButtonTable = Buttons.BuildTable(); 
OutPut.Text = ButtonTable.Rows.Count.ToString(); 

を持つクラスGetData.csで私Default.aspx.csページで

public Table BuildTable() 
{ 
    Table tButtons = new Table(); 
    TableRow tRow = new TableRow(); 
    TableCell tCell = new TableCell(); 
    long lColumn = 0; 
    long lPreviousColumn = 0; 
    long lRow = 0; 
    long lPreviousRow = 0; 
    long lLanguage = 0; 
    long lPreviousLanguage=0; 
    OpenConnection(); 
    ButtonData(); 
    Int32 lRowOrd = aReader.GetOrdinal("RowNumber"); 
    Int32 lColOrd = aReader.GetOrdinal("ColumnNumber"); 
    Int32 lLangOrd = aReader.GetOrdinal("Language"); 
    Int32 lLabelOrd = aReader.GetOrdinal("Label"); 

    while (aReader.Read()) 
    { 

     lRow = IsDbNull(aReader,lRowOrd);//first get our column number 
     lColumn = IsDbNull(aReader,lColOrd);//first get our column number 
     lLanguage = IsDbNull(aReader,lLangOrd);//first get our column number 
     if (lPreviousRow != lRow)//we have a new row 
     { 
      if (lPreviousRow != 0)//then we are working on one and need to save it before moving on 
      { 
       tButtons.Rows.Add(tRow);//add the new row to the table 
      } 
      lPreviousRow = lRow;//remember the value for next time 
      tRow = new TableRow(); 
      tRow.Visible = true; 
      //*******put the category titles in here somewhere 
     } 
     if (lPreviousColumn != lColumn)//we have a new column 
     { 
      if (lPreviousColumn != 0)//then we are working on one and need to save it before moving on 
      { 
       tRow.Cells.Add(tCell);//add the new cell to the row 
      } 
      lPreviousColumn = lColumn;//remember the value for next time 
      //*******add the cell colors 
      if (lPreviousLanguage != lLanguage)//we have a new column 
      { 
       lPreviousLanguage = lLanguage;//remember the value for next time 
       tCell.Text = IsDbNull(aReader,lLabelOrd,""); 
       //*******add the languages to properties 
      } 
      tCell = new TableCell(); 
      tCell.Visible=true; 
     } 
    } 
    CloseConnection(); 
    tButtons.Visible=true; 
    return tButtons; 
} 

をテーブルを構築しています4行ですが、表は空です。

<table id="ButtonTable" border="0"></table> 

私は間違っていますか?

+0

これはASP.NETの質問です。私はC#が美しくエレガントな言語であると考えています。私は、混乱と種類の面倒なASP.NETを見つける。 –

+0

Default.aspx.csからどのイベントハンドラでコードを呼び出していますか? – Migol

+0

はpublic Table ButtonTable() はパブリックテーブルのBuildTable()ですか? – pfunk

答えて

5

何が欠けていますか?

明らかに、たくさん。マークアップでは、System.Web.UI.WebControls.Tableのインスタンスが宣言されています。 Pageクラスのインスタンスでは、変数名は "ButtonTable"になります。また、自動的にPage.Controlsコレクションに追加されます。ページがレンダリングされるとき、Controlsコレクションは反復され、順にレンダリングされます。

default.aspx.csコードでは、ButtonTableリファレンスがに異なるテーブルコントロールを指しているだけですが、Page.Controlsコレクションには影響しません。レンダリング時間が来ると、それはレンダリングされるマークアップで定義された(ブランク)テーブルです。あなたのBuildTable呼び出しの結果ではありません。

これはすべて、「あなたは間違っている」とかなり長い間巻き込まれています。 への答えがの場合、別のクラスのテーブル構築コードが「適切な方法」で明快に表示されます。しかし、 - 私は犯罪ではないことを意味しています - あなたはそれ以上の前に、ASP.NETの背後にある基礎を勉強する必要があると思います。

言われていること、ほとんどの即時修正(しかしそうないあなたが本当にをしたい)、それがレンダリングされるように、Controlsコレクションにテーブルを追加することです:それはレンダリングすること

GetData Buttons = new GetData();//create a reference to the class 
ButtonTable = Buttons.BuildTable(); 
this.Controls.Add(ButtonTable); 
OutPut.Text = ButtonTable.Rows.Count.ToString(); 

注意あなたのマークアップで定義されたButtonTableとは別に、の出力ラベルの後にはが配置されます。これは、出力ラベルの後に追加されたためです。

+0

違反はありません。あなたは揺れます - ありがとう。私は作成されたテーブル変数を指していると思ったが、レンダリングする方法を知らなかった。なぜコードを柔軟にし、モジュール化して再利用できるようにするのか。 :) – Praesagus

+0

RE:別のクラス:代わりにUserControlまたはServer Controlを提案します。あなたが本当に必要としない限り、あなたは本当に "ダイナミックコントロール"(別名、マークアップに含まれていないもの)のウサギの穴を降りたいとは思わない。 –

0

ButtonTable = Buttons.BuildTable();

あなたはここで何をしていますか?

1

私は本当にあなたをお勧め:それをリファクタリング

  • に何が起こっているか見るためにデバッガでのラインによって

    • ランそれはライン、コードが読みにくいです。コメントを追加してもそれは解決しません。
    • 達成したいことを考え、ListViewのようなコントロールにデータバインドすることができるかどうかを確認します。

      GetData Buttons = new GetData(); 
      ButtonTable = Buttons.BuildTable(); // this is what's wrong 
      OutPut.Text = ButtonTable.Rows.Count.ToString(); 
      

      はちょうどそれはそれを行う方法はありませんページ内のコントロールを割り当てる:、あなたのコードを言っ

    。返されたテーブルをcontrolsコレクションに追加するか、情報をロードするテーブルを受け取るようにBuildTableを変更します。非常に奇妙な問題を持つコードをデバッグし、開発者がasp.netの間に乱れたコントロール(コントロールのプロパティではない)にnullを割り当てた場合、asp.netページのコントロールに直接割り当てることは決してないレンダリングサイクル。

    +0

    指示をお寄せいただきありがとうございます。それに応じて修正します。 :) – Praesagus

    +0

    @Praesagusはあなたの質問を解決することを意味する場合、あなたは常に受け入れられた変更することができます;) – eglasius

    関連する問題