2010-03-08 4 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] ;      
    } 
} 

Edit: более тщательно Чтения вашего вопроса, ваша проблема в корне за пределами этого цикла. Даже если вы применили вышеупомянутое исправление, вы все равно не получите то, на что надеетесь. Вам нужно сделать петлю над списком и добавить каждый элемент в список строки и добавить эту строку в таблицу. Что-то вроде этого:

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, без него новые строки не будут добавлены. –

+0

Рад помочь! Я написал код, не тестируя его, но значение 'drow [currColIndex ++] =' drow [#] должно правильно увеличивать индекс в цикле. – jball

Смежные вопросы