Создание карты мест с неизвестными строками / столбцами (или: автоматически созданные столбцы GridView не в виде текста?) - PullRequest
1 голос
/ 24 марта 2012

Я хочу иметь таблицу рассадки с кликабельными кнопками ImageButton, показывающими, занято ли место.
Дело в том, что количество строк / столбцов зависит от выбранного театра.

Пока у меня есть DataTable, заполненный 0 для свободных мест и 1 для занятых.
Этот DataTable заполняется в соответствии со строками / столбцами театра, а затем 1 помещаются в таблицу доступа со всеми занятыми местами (билетами).

Я нашел два способа показать эту таблицу данных:
GridView с AutoGenerateColumns = "true"
Проблема с этим заключается в том, что он автоматически генерирует в виде простого текста, в то время как я хочу ImageButtons.

Элемент управления Table, а в Page_Load я создаю его с помощью циклов и заполняю его ячейки кнопками ImageButtons
Проблема в том, что кнопки ImageButton (при отображении правильного изображения) не реагируют на щелчки, поскольку я не могу вызвать ImageButton1_OnClick и т.п., а использование CommandName также не показало результатов.

Код, заполняющий элемент управления Table:

protected void Page_Load(object sender, EventArgs e)
{
    Showing show = (Showing)Session["show"];

    DataTable dt = DB.GetShowingSeats(show); //gets a table filled with 0's and 1's

    foreach (DataRow row in dt.Rows)
    {
        TableRow Trow = new TableRow();

        foreach (DataColumn col in dt.Columns)
        {
            TableCell Tcell = new TableCell();
            ImageButton btn = new ImageButton();

            btn.CommandName = "btnClick";    //doesn't work
            btn.OnClientClick = "btn_Click";  //also doesn't work

            if ((string)row[col] == "0")
            {
                btn.ImageUrl = "~/images/empty.png";
            }
            else
            {
                btn.ImageUrl = "~/images/taken.png";
                btn.Enabled = false;
            }

            Tcell.Controls.Add(btn);
            Trow.Cells.Add(Tcell);
        }

        this.tableSeats.Rows.Add(Trow);
    }
}

Так что, в принципе, либо те или иные кнопки в таблице имеют событие OnClick (а также мне нужно знать строку / столбец нажатой кнопки)
OR
Я могу изменить AutoGenerateColumns сделать столбцы с ImageButtons вместо текста (если это невозможно, есть ли способ, которым я могу «автоматически» генерировать свои собственные столбцы на Page_Load?)

1 Ответ

0 голосов
/ 05 апреля 2012

Я бы просто

  • Просмотрите вашу коллекцию DataTable.Columns,
  • Создайте объект ImageField для каждого столбца в вашем источнике данных
  • Добавьте эту ImageField в свою коллекцию GridView.Columns.
  • Свяжите свой DataTable с GridView.

Вот пример кода:

protected void Page_Load(object sender, EventArgs e)
{
    DataTable tbl = generateTable(); // A table of 1's an 0's
    foreach (DataColumn col in tbl.Columns)
    {
        ImageField img = new ImageField();
        img.DataImageUrlField = col.ColumnName;
        // I have 2 images in my "/Images" folder, 1.jpg and 0.jpg.
        img.DataImageUrlFormatString = "/Images/{0}.jpg";
        GridView1.Columns.Add(img);
    }
    GridView1.DataSource = tbl;
    GridView1.DataBind();
}

Единственное предостережение в том, что это зависит от того, какие столбцы DataTable имеют ColumnName. Это может быть что угодно (в этом примере мои просто целые числа). Таким образом, вы можете использовать привязку данных для привязки ImageField s к вашим DataTable столбцам.


Для справки, вот код, который я использовал для создания таблицы

// Generates a 10 x 10 table of 1's and 0's
public DataTable generateTable()
{
    DataTable tbl = new DataTable("seats");
    for (int i = 0; i < 10; i++)
    {
        tbl.Columns.Add(i.ToString());
    }
    Random rand = new Random();
    for(int i = 0; i < 10; i++)
    {
        DataRow row = tbl.NewRow();
        for (int j = 0; j < 10; j++)
        {
            row[j] = rand.Next(10) > 5 ? 0 : 1;
        }
        tbl.Rows.Add(row);
    }
    return tbl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...