Почему в моей таблице нет содержимого в ASP.NET? - PullRequest
1 голос
/ 18 марта 2009

Я построил таблицу в классе GetData.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;
}

На моей странице Default.aspx.cs у меня есть

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

In Default.aspx

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

Выходные данные показывают 4 строки, но таблица пуста.

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

Что я делаю не так?

Ответы [ 3 ]

5 голосов
/ 18 марта 2009

Какого черта я пропускаю?

Видимо, много. В вашей разметке вы объявили экземпляр System.Web.UI.WebControls.Table . В вашем экземпляре класса Page это будет иметь имя переменной «ButtonTable». Он также будет автоматически добавлен в коллекцию Page.Controls . Когда страница будет отображаться, коллекция Controls будет повторяться и отображаться по очереди.

В вашем коде default.aspx.cs вы просто указываете ссылку на ButtonTable на другой элемент управления Table - но вы не влияете на коллекцию 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, и поэтому будет помещен после метки вывода. Это потому, что он был добавлен после метки Output.

1 голос
/ 18 марта 2009

Я действительно предлагаю вам:

  • Запустите его построчно в отладчике, чтобы увидеть, что происходит
  • Рефакторинг, код трудно читать. Добавление дополнительных комментариев не решит эту проблему.
  • Подумайте, чего вы хотите достичь, и проверьте, подходит ли он для привязки данных к элементу управления, например ListView.

Тем не менее, ваш код:

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

Просто назначить элемент управления на странице - это не способ сделать это. Либо добавьте возвращенную таблицу в коллекцию элементов управления, либо измените BuildTable, чтобы получить таблицу, в которую она будет загружать информацию. Никогда не назначайте элементу управления страницу asp.net напрямую, однажды мне пришлось отлаживать код с некоторыми очень странными проблемами, и разработчик назначил null для элемента управления (не для свойства элемента управления), который испортился во время asp.net цикл рендеринга.

0 голосов
/ 18 марта 2009

ButtonTable = Buttons.BuildTable ();

Что ты здесь делаешь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...