【问题标题】:ASP.NET: dynamically adding a matrix of images to each row of a GridviewASP.NET:动态地将图像矩阵添加到 Gridview 的每一行
【发布时间】:2025-12-09 16:05:03
【问题描述】:

我想动态地将图像矩阵添加到 GridView 的每一行。假设我想要每行相同图像的 5 x 5 矩阵,路径是:

public static string PASS = "./Images/pass.png";

还假设它是 Gridview 中的 Gridview(我不确定内部 Gridview 是否是正确使用的控件):

<asp:GridView ID="GridView1" runat="server">
        <Columns>
            <asp:TemplateField>
                <asp:ItemTemplate>
                    <asp:GridView ID="GridView2" runat="server">
                    </asp:GridView>
                </asp:ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>

如何将每个矩阵动态添加到每一行?

编辑:

好的,这是第一次尝试使用史蒂夫的答案,并松散地遵循 http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.datalist.items.aspx 作为模型。我对如何在 GridView 中动态添加 DataList 以及如何(以及何时)进行数据绑定感到困惑。

protected void Page_Load(object sender, EventArgs e)
    {
        DataTable table = new DataTable();
        table.Columns.Add("DataList", typeof(DataList));

        for (int i = 0; i < 4; i++)
        {
            DataRow dr = table.NewRow();
            DataList1.DataSource = CreateDataSource();
            DataList1.DataBind();
            table.Rows.Add(dr);
        }
        GridView1.DataSource = table;
        GridView1.DataBind();

    }

    ICollection CreateDataSource()
    {
        string imageLocation = "./Images/311.jpg";
        DataTable dt = new DataTable();
        DataRow dr;

        dt.Columns.Add(new DataColumn("ImageURL", typeof(string)));

        for (int i = 0; i < 25; i++)
        {
            dr = dt.NewRow();
            dr[0] = imageLocation;
            dt.Rows.Add(dr);
        }

        DataView dv = new DataView(dt);
        return dv;
    }

<form id="form1" runat="server">
<div>
    <asp:GridView ID="GridView1" runat="server">
        <Columns>
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:DataList ID="DataList1" RepeatColumns="5" runat="server">
                        <ItemTemplate>     
                           <img src="<%# DataBinder.Eval(Container.DataItem, "ImageURL") %> />    
                        </ItemTemplate>
                    </asp:DataList>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>

</div>
</form>

我得到的特殊例外是:

ID 为“GridView1”的 GridView 的数据源没有任何用于生成列的属性或属性。确保您的数据源有内容。

我哪里错了?

【问题讨论】:

    标签: asp.net gridview


    【解决方案1】:

    改用数据列表怎么样?创建一个通用的字符串集合列表,添加25个“./Images/pass.png”并将其绑定到datalist。

    在项目模板中,你有这个:

    编辑(将 eval 更改为容器)

    <asp:DataList ID="DataList1" RepeatColumns="5" runat="server">
        <ItemTemplate>
            <img src="<%# Container.DataItem %>" />
        </ItemTemplate>
    </asp:DataList>
    

    可能有一种更快的方法可以将 25 个字符串实例放入集合中,或者有更好的方法来表示它,但我现在想不出一个。

    【讨论】:

      【解决方案2】:
          Protected void Page_Load(object sender, EventArgs e)
          {
              DataTable table = new DataTable();
              table.Columns.Add("DataList", typeof(DataList));
              DataRow dr = table.NewRow();
              table.Rows.Add(dr);
             GridView1.DataSource = table;
              GridView1.DataBind();
      
          }
      
          ICollection CreateDataSource()
          {
              string imageLocation = "~/text.jpg";  
              DataTable dt = new DataTable();
              DataRow dr;
      
              dt.Columns.Add(new DataColumn("ImageURL", typeof(string)));
      
              for (int i = 0; i < 25; i++)
              {
                  dr = dt.NewRow();
                  dr[0] = imageLocation;
                  dt.Rows.Add(dr);
              }
      
              DataView dv = new DataView(dt);
              return dv;
          }
      
          protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
          {
              if (e.Row.RowType == DataControlRowType.DataRow)
              {
                  DataList dataList1 = e.Row.FindControl("DataList1") as DataList;
                  dataList1.DataSource = CreateDataSource();
                  dataList1.DataBind();
              }
          } 
      
      
          <asp:GridView ID="GridView1" runat="server" 
             onrowdatabound="GridView1_RowDataBound" AutoGenerateColumns="false"> 
            <Columns> 
              <asp:TemplateField> 
                  <ItemTemplate> 
                      <asp:DataList ID="DataList1" RepeatColumns="5" runat="server"> 
                          <ItemTemplate>      
                              <asp:Image ID="img" runat="server" 
                                   ImageUrl='<%# DataBinder.Eval         
                                     (Container.DataItem, "ImageURL") %>'  />
                          </ItemTemplate> 
                      </asp:DataList> 
                  </ItemTemplate> 
              </asp:TemplateField> 
          </Columns> 
      </asp:GridView> 
      

      【讨论】:

        【解决方案3】:

        它必须是网格视图吗?为什么不能是 asp:table?

        【讨论】:

          最近更新 更多