Как программно вставить дополнительную строку в ASP.NET DataGrid? - PullRequest
0 голосов
/ 20 января 2009

Я хотел бы программно вставить дополнительные строки в DataGrid (выступать в качестве подзаголовков). Я следил за несколькими статьями в Интернете (а именно, опцией 3 из http://aspalliance.com/723), но все они приводят к тому, что строка отображается правильно, но без содержания.

Вот важная часть кода, который я использую:

private void MyDataGrid_ItemCreated(object sender, DataGridItemEventArgs e)
{

    // This method will create a subheading row if needed
    if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
    {
        // TableCell
        TableCell tc = new TableCell();
        tc.Controls.Add(new LiteralControl("foo"));
        tc.ColumnSpan = e.Item.Cells.Count;

        // DataGridItem
        DataGridItem di = new DataGridItem(e.Item.ItemIndex + 1, 0, ListItemType.Item);
        di.Height = new Unit(100, UnitType.Pixel);
        di.CssClass = "testClass";
        di.Controls.Add(tc);

        // DataGrid Table
        DataGrid dg = (DataGrid)sender;
        Table childTable = (Table)dg.Controls[0];
        childTable.Rows.Add(di);
    }      

}

Это приводит к тому, что следующая разметка генерируется в правильном месте, но без LiteralControl ("foo")

<tr class="testClass" style="height:100px;">
</tr>

Я бы хотел использовать этот подход, а не манипулировать самим источником данных. Что может быть не так?

Ответы [ 2 ]

2 голосов
/ 20 января 2009

Проблема решена - где-то в 2500 строках существующего кода позади что-то скрывало первый столбец, эффективно удаляя мое дополнение. На что-то стоит обратить внимание, если у кого-то еще есть подобные проблемы.

Edit - вот код, который я написал, чтобы обойти проблему достаточно обобщенно:

private void InsertDataGridRow(DataGrid dataGrid, int index, TableCell tc)
{
    DataGridItem di = new DataGridItem(index, 0, ListItemType.Item);

    // Check which columns are visible
    bool foundFirstVisibleColumn = false;
    int numberOfVisibleColumns = 0;
    foreach (DataGridColumn column in dataGrid.Columns)
    {
        if (column.Visible == true)
        {
            numberOfVisibleColumns++;
            foundFirstVisibleColumn = true;
        }

        // Add dummy columns in the columns that are hidden
        if (!foundFirstVisibleColumn)
        {
            di.Cells.Add(new TableCell());
        }

    }

    tc.ColumnSpan = numberOfVisibleColumns;
    di.Cells.Add(tc);
    Table t = (Table)dataGrid.Controls[0];
    t.Rows.Add(di);
}

А вышесказанное можно назвать примерно так:

private void MyDataGrid_ItemCreated(object sender, DataGridItemEventArgs e)
{
    // This method will create a subheading row if needed
    if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
    {
        TableCell tc = new TableCell();
        tc.Controls.Add(new LiteralControl("foo"));

        InsertDataGridRow(
            (DataGrid)sender,
            e.Item.ItemIndex + 1,
            tc);
    }      

}
1 голос
/ 20 января 2009

Я только что попробовал отдельный пример, используя код, который вы разместили, и он работает просто отлично. Это должно быть связано с настройкой вашей DataGrid или с чем-то другим в вашем коде.

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