Как получить значения из полей шаблона в GridView?

Это моя разметка GridView.

<Columns>
    <asp:TemplateField HeaderText="Customer Name">
        <ItemTemplate>
            <asp:Label ID="lblname" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Customer.Name")%>'></asp:Label>
        </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="PickUpPoint">
        <ItemTemplate>
            <asp:Label ID="lblPickUpPoint" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Pickuppoint")%>'></asp:Label>
        </ItemTemplate>
    </asp:TemplateField>
</Columns>

У меня есть кнопка, которая хранит значения в ячейках рабочего листа объекта excel.

for (int i = 0; i < GridView2.Rows.Count; i++)
{
    for (int j = 0; j < GridView2.Rows[i].Cells.Count; j++)
    {
        xlWorkSheet.Cells[i + 1, j + 1] = GridView2.Rows[i].Cells[j].Text;
   }
}

Как получить значения GridView и сохранить их на листе, поскольку GridView2.Rows[i].Cells[j].Text возвращает пустую строку.


person Sandeep    schedule 10.12.2012    source источник


Ответы (4)


Вам не хватает типа. Сделай это так-

Label name = (Label)GridView2.Rows[i].Cells[j].FindControl("lblname");
xlWorkSheet.Cells[i + 1, j + 1] = name.Text;

Обновить- Если вы можете назвать свои ярлыки как Label0 и Label1, то во втором цикле for-

for (int j = 0; j < GridView2.Rows[i].Cells.Count; j++)
  {
     Label xyz = (Label)GridView2.Rows[i].Cells[j].FindControl("Label"+j);
     xlWorkSheet.Cells[i + 1, j + 1] = xyz.Text;
  }

Для текста заголовка- string hText = GridView2.HeaderRow.Cells[your column number].Text;

person Cdeez    schedule 10.12.2012
comment
хорошо... но как это сделать для других элементов управления... если цикл входит во второй тым... как я могу указать метку на lblPickUpPoint.... спасибо - person Sandeep; 10.12.2012
comment
работает как очаровательный человек.... спасибо...... Изменить: теперь я получаю все данные внутри Gridview.. как я могу сделать так, чтобы TemplateField HeaderText также попадал внутрь рабочего листа...??? заранее спасибо... - person Sandeep; 10.12.2012
comment
Как я могу сделать так, чтобы TemplateField HeaderText тоже попадало внутрь рабочего листа...?? - person Sandeep; 10.12.2012
comment
эй, 1 последняя очередь...?? GridView отображается в Excel, но не в правильном формате. Я имею в виду, что все некоторые данные Листа в них перекрываются. как я могу получить значения в представлении сетки так же, как они отображаются в представлении сетки..?? Спасибо - person Sandeep; 10.12.2012

Для получения значений сделайте следующее:

for (int i = 0; i < GridView2.Rows.Count; i++)
{
  //extract the TextBox values
  Label lblname= (Label)GridView2.Rows[i].Cells[0].FindControl("lblname");
  Label lblPickUpPoint= (Label)GridView2.Rows[i].Cells[0].FindControl("lblPickUpPoint");
  //Do your excel binding here
}
person sajanyamaha    schedule 10.12.2012
comment
я получил значения из полей, как мне привязать их к рабочему листу... как xlWorkSheet.Cells[i + 1, j + 1] = GridView2.Rows[i].Cells[j].Text; Что мне нужно сделать, если мне нужно расположить их по порядку... отредактировать: мне нужен второй цикл for.. ??? - person Sandeep; 10.12.2012
comment
Если вы хотите писать построчно в Excel, попробуйте следующее: clear-lines.com/blog/post/ Если вам нужен полный экспорт gridview, попробуйте это: codeproject.com/Tips/477436/ - person sajanyamaha; 10.12.2012

{cell}.Text будет работать, только если в TemplateField нет элемента управления. Вы добавили метку в свой шаблон, поэтому вам сначала нужно найти элемент управления, привести свой объект к элементу управления и получить доступ к свойствам элемента управления по мере необходимости.

Если вам нужен более общий подход, вы всегда можете сделать следующее (удалить элемент управления меткой и просто добавить оцениваемое поле):

<Columns>
    <asp:TemplateField HeaderText="Customer Name">
        <ItemTemplate>
            <%# DataBinder.Eval(Container.DataItem, "Customer.Name")%>
        </ItemTemplate>
     </asp:TemplateField>
     <asp:TemplateField HeaderText="PickUpPoint">
         <ItemTemplate>
             <%# DataBinder.Eval(Container.DataItem, "Pickuppoint")%>
         </ItemTemplate>
     </asp:TemplateField>
</Columns>

Когда вы используете исходный код, {cell}.Text больше не должен возвращаться пустым.

person Clarice Bouwer    schedule 10.12.2012
comment
‹facepalm› Извините, я мог бы поклясться, что это сработало на одном этапе, но я должен ужасно ошибаться. Я думаю, что лучше всего использовать BoundField, если вы не собираетесь делать что-то нестандартное со своими данными. В противном случае вы могли бы использовать ((Label)gvTest.Rows[i].Cells[j].Controls[1]).Text Насколько мне известно, элемент управления меткой всегда будет иметь индекс 1, если у вас нет дополнительных элементов управления, добавленных в ваш шаблон перед меткой. - person Clarice Bouwer; 10.12.2012

Попробуйте использовать этот код, у меня была аналогичная проблема. Я думаю, что этот код более динамичен и вам не придется каждый раз находить название метки. Но чтобы сохранить соответствие между элементами управления И индексом Controls [ ]:

for (int row = 1; row <= totalRows; row++)
{
    for (int col = 0; col < totalCols; col++)
    {
        if (GridView1.Columns[col].Visible)
        {
            if (String.IsNullOrEmpty(GridView1.Rows[row - 1].Cells[col].Text))
            {
                if (GridView1.Rows[row - 1].Cells[col].Controls[1].GetType().ToString().Contains("Label"))
                {
                    Label LB = (Label)GridView1.Rows[row - 1].Cells[col].Controls[1];
                    workSheet.Cells[row + 1, col + 1].Value = LB.Text;
                }
                else if (GridView1.Rows[row - 1].Cells[col].Controls[1].GetType().ToString().Contains("LinkButton"))
                {
                    LinkButton LB = (LinkButton)GridView1.Rows[row - 1].Cells[col].Controls[1];
                    workSheet.Cells[row + 1, col + 1].Value = LB.Text;
                }
            }
            else
            {
                workSheet.Cells[row + 1, col + 1].Value = GridView1.Rows[row - 1].Cells[col].Text;
            }
person Nitzan Malichi    schedule 09.08.2016