Программно отображать данные в столбце представления сетки

У меня есть список количества продуктов и сетка. Вид сетки уже привязан к некоторым данным. Но я хотел отобразить список количества продуктов в третьем столбце сетки. Вот код того, как я привязываю данные к представлению сетки:

gvProduct.DataSource = distSPUItem;
gvProduct.DataBind();
BoundField column = new BoundField(); 
column = new BoundField();
column.HeaderText = "Unit Quantity";
for (int index = 0; index < productQuantityList.Count; index++)
{
   column.DataField = index.ToString();
}
gvProduct.Columns.Add(column);

Мне нужно пройтись по списку количества продуктов и отобразить результат в третьем столбце представления сетки. Однако столбец не отображается. Какие-нибудь решения?

Заранее спасибо.

Отредактированная часть

protected void gvProduct_RowDataBound(Object sender, GridViewRowEventArgs e)
    {
        int unitQuantity = 0;
        if(e.Row.RowType == DataControlRowType.DataRow)
        {
            for(int index = 0; index < productQuantityList.Count; index++)
            {
                unitQuantity = productQuantityList[index];
            }
            Label lblUnitQuantity = (Label)e.Row.FindControl("lblUnitQuantity");
            lblUnitQuantity.Text = unitQuantity.ToString();
        }
    }

person Community    schedule 01.01.2014    source источник
comment
Какой тип distSPUItem и productQuantityList?   -  person ekad    schedule 01.01.2014
comment
distSPUItem извлекается из класса List ‹DistributionStandardPackingUnitItems› distSPUItem = new List ‹DistributionStandardPackingUnitItems› () ;. productQuantityList - это целочисленный тип. Я неправильно определяю новый столбец?   -  person    schedule 01.01.2014


Ответы (2)


Было бы лучше, если бы вы сделали это в RowDataBound событии. Сначала вам нужно добавить столбец и OnRowDataBound="gvProduct_RowDataBound" в код aspx:

<asp:GridView ID="gvProduct" runat="server" AutoGenerateColumns="False" OnRowDataBound="gvProduct_RowDataBound">
    <Columns>
        <!-- Existing columns here  -->
        <asp:TemplateField HeaderText="Unit Quantity">
            <ItemTemplate>
                <asp:Label ID="lblUnitQuantity" runat="server"></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

Затем установите текстовое значение lblUnitQuantity в методе gvProduct_RowDataBound в коде позади:

protected void gvProduct_RowDataBound(Object sender, GridViewRowEventArgs e)
{
    if(e.Row.RowType == DataControlRowType.DataRow)
    {
        int unitQuantity = productQuantityList[e.Row.RowIndex];
        Label lblUnitQuantity = (Label)e.Row.FindControl("lblUnitQuantity");
        lblUnitQuantity.Text = unitQuantity.ToString();
    }
}

Примечание: gvProduct_RowDataBound будет выполняться для каждой строки из источника данных, поэтому, если distSPUItem имеет 10 элементов, тогда gvProduct_RowDataBound будет выполняться 10 раз при увеличении значения e.Row.RowIndex, начиная с 0. Приведенный выше код будет работать, только если productQuantityList и distSPUItem имеют одинаковые номера элементов, иначе будет ошибка.

См. здесь для получения дополнительной информации о RowDataBound мероприятии.

person ekad    schedule 01.01.2014
comment
Я получил список productQuantityList 1,2,1,1,2,2,2,2,2,2. Однако, когда я сделал это в методе RowDataBound, он вернул мне все 2,2,2 ... Вы можете помочь мне проверить отредактированную часть? - person ; 01.01.2014
comment
Сначала я должен сохранить количество в списке, потому что список извлекается из других частей моего кода, и это действительно сложно. - person ; 01.01.2014
comment
Вы хотите сказать, что первая строка должна быть 1, вторая должна быть 2, третья и четвертая должны быть 1, а остальные должны быть 2? - person ekad; 01.01.2014
comment
Да productQuantityList является целым числом tho - person ; 01.01.2014
comment
Оно работает. И да, когда я добавляю элементы в distSPUItem, я добавляю количество в productQUantityList, а также в другие части кода. Но не могли бы вы немного рассказать о методе RowDataBound? - person ; 01.01.2014
comment
В свой ответ добавлено объяснение. - person ekad; 01.01.2014

Я бы попробовал решить проблему так:

Допустим, у вас есть товар, например:

public class Product
{
    public string Data1 { get; set; }
    public string Data2 { get; set; }

    public Product(string data1, string data2)
    {
        Data1 = data1;
        Data2 = data2;
    }
}

Если вам нужна дополнительная информация, например какой-то индекс, создайте такой класс:

public class ProductExtended
{
    public string Data1 { get; set; }
    public string Data2 { get; set; }
    public int Index { get; set; }

    public ProductExtended(Product product, int index)
    {
        Data1 = product.Data1;
        Data2 = product.Data2;
        Index = index;
    }
}

Затем преобразуйте список элементов продукта в список элементов ProductExtended:

List<Product> products = new List<Product>();
// ...

int i = 0;
List<ProductExtended> productsExtended = products.Select(p => new ProductExtended(p, i++)).ToList();

И, наконец, привяжите этот новый список к вашей сетке.

person mrzli    schedule 01.01.2014
comment
Спасибо за усилия, и я бы хотел попробовать. Однако для другой части моих кодов существует множество логических схем, позволяющих получить элементы в productQuantityList, и я не мог их изменить. - person ; 01.01.2014