2010-03-08 201 views
1

我想填充下面的图像的GridView:填充gridview的细胞通过细胞

<asp:GridView ID="GrdDynamic" runat="server" AutoGenerateColumns="False"> 
    <Columns> 
    </Columns> 
</asp:GridView> 

通过目录下迭代的代码,然后我收集影像标题,并希望他们在GridView控件来填充。粗体代码工作不正常,gridview只填充列表中的最后一个图像。

List<string> imagelist = new List<string>(); 

protected void Page_Load(object sender, EventArgs e) 
{ 
    foreach (String image in Directory.GetFiles(Server.MapPath("example/"))) 
    { 
     imagelist.Add("~/example/" + Path.GetFileName(image)); 
    } 
    loadDynamicGrid(imagelist); 
} 

private void loadDynamicGrid(List<string> list) 
{ 
    DataTable dt = new DataTable(); 

    DataColumn dcol = new DataColumn(NAME, typeof(System.String)); 
    dt.Columns.Add(dcol); 

    dcol = new DataColumn("NAME1", typeof(System.String)); 
    dt.Columns.Add(dcol); 

    dcol = new DataColumn("NAME2", typeof(System.String)); 
    dt.Columns.Add(dcol); 

    dcol = new DataColumn("NAME3", typeof(System.String)); 
    dt.Columns.Add(dcol); 

    DataRow drow = dt.NewRow(); 
      dt.Rows.Add(); 
      dt.Rows.Add(); 

      **for (int i = 0; i < dt.Rows.Count; i++) 
      { 
       for (int j = 0; j < dt.Columns.Count; j++) 
       { 
        foreach (string value in list) 
        { 
         dt.Rows[i][j] = value; 
        } 
       } 
      }** 

    foreach (DataColumn col in dt.Columns) 
    { 
     ImageField bfield = new ImageField(); 

     bfield.DataImageUrlField = NAME; 

     bfield.HeaderText = col.ColumnName; 

     GrdDynamic.Columns.Add(bfield); 
    } 

    GrdDynamic.DataSource = dt; 

    GrdDynamic.DataBind(); 
} 

如何使用可用数量的图像填充gridview逐个单元格?

我知道这很容易,我尝试过各种方法,如:dt.Rows.Add(list);和其他一些尝试,但他们没有工作。我很愚蠢。 我很乐意提供任何帮助。

回答

1

您正在重复设置每个单元格的每个字符串与您的foreach。您需要添加list中与特定单元格对应的特定元素。尝试是这样的:

for (int i = 0; i < dt.Rows.Count; i++) 
{ 
    for (int j = 0; j < dt.Columns.Count; j++) 
    { 
     //below line assumes list has more than i*j elements 
     //how you want to handle anything outside that case 
     //is not clear 
     dt.Rows[i][j] = list[(i * dt.Columns.Count) + j] ;      
    } 
} 

编辑:更加仔细阅读你的问题,你的问题是根本的是循环之外。即使你应用了上述修正,你仍然不会得到你所希望的。你需要做的是循环播放列表,并将列表中的每一项添加到一行中,并将该行添加到表中。就像这样:

int currColIndex = 0; 
DataRow drow = dt.NewRow(); 
foreach(string value in list) 
{ 
    if(currColIndex >= dt.Columns.Count) 
    { 
     dt.Rows.Add(drow); 
     drow = dt.NewRow(); 
     currColIndex = 0; 
    } 
    drow[currColIndex++] = value;  
} 
if(currColIndex != dt.Columns.Count) 
{ 
    dt.Rows.Add(drow); 
} 
+0

确实!非常整洁的解决方案!非常感谢你!这对我帮助很大。我只想添加一点点评论。您忘记将currColIndex ++放入foreach循环中,而不会添加新行。 – 2010-03-09 18:56:28

+0

很高兴帮助!我没有测试过编写代码,但是'drow [currColIndex ++] = value;'应该正确地增加循环中的索引。 – jball 2010-03-10 00:03:08