创建一个包含未知行/列的座位图(或者:GridView自动生成的列不是文本?)

时间:2012-03-24 17:17:22

标签: asp.net charts

我希望有一个座位表,可点击的ImageButtons显示座位是否被拍摄 问题是,行/列的数量取决于所选的剧院。

到目前为止,我有一个DataTable填充0表示空座位,1表示座位 这个DataTable根据剧院的行/列进行填充,然后通过Access表格放置1个所有座位(票证)。

我找到了两种显示此DataTable的方法:
一个GridView, AutoGenerateColumns =“true”
这个问题是它在我想要ImageButtons时自动生成纯文本。

一个表格控件,在Page_Load上我使用循环创建它并用ImageButtons填充它的单元格
这里的问题是ImageButtons(显示正确的图像)不响应点击,因为我无法调用ImageButton1_OnClick等,并且使用CommandName也没有显示任何结果。

填充表格控件的代码:

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事件(我还需要知道点击按钮的行/列)

我可以更改AutoGenerateColumns使用ImageButtons而不是文本创建列(如果不可能,有没有办法在“Page_Load”上“自动”生成我自己的列?)

1 个答案:

答案 0 :(得分:0)

我会

以下是一些示例代码:

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();
}

唯一需要注意的是,它取决于具有ColumnName的DataTable列。它可以是任何东西(在这个样本中,我的只是整数)。这样,您就可以使用数据绑定将ImageField绑定到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;
}