Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> GridView и TemplateField, Как получить данные из Recordset? 
:(
    Опции темы
Pankon
Дата 3.7.2008, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: 2
Всего: 5



Код

  <asp:TemplateField>
    <ItemTemplate> 
      <asp:Label ID="lbl1" Runat="Server" Text='<%# Bind("Col_1") %>' />
      <%
     string col2Value = Bind("Col_2");
     if(col2Value =="blabla")
     {
        итд.
     }
      %>
    </ItemTemplate>
  </asp:TemplateField> 

Не работает строчка string col2Value = Bind("Col_2");.
Как получить для переменной col2Value  значение ячейки?
PM MAIL   Вверх
Bogdan1024
Дата 3.7.2008, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1436
Регистрация: 28.9.2005
Где: Киев

Репутация: 1
Всего: 13



GridView, DetailsView и FormView - единственные элементы управления, где можно использовать Bind. Теоретически нужно ругнуться и на 
Цитата
<asp:Label ID="lbl1" Runat="Server" Text='<%# Bind("Col_1") %>' />

Попробуй использовать Eval или Container.чтототам.
Что вообще должен делать сей код?


--------------------
user posted image
PM MAIL   Вверх
Idsa
Дата 3.7.2008, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Цитата(Bogdan1024 @  4.7.2008,  01:36 Найти цитируемый пост)
Что вообще должен делать сей код? 

Должен динамически формировать template на основании значений свойств.

У меня вообще большие сомнения по поводу того, можно ли вставлять код в template...


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Idsa
Дата 5.7.2008, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Pankon, вставлять inline код в темплейт нельзя.
Есть 2 выхода.
1. Воспользоваться вспомогательным методом.
Код

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication8._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title>Untitled Page</title>
</head>
<body>
  <form id="form1" runat="server">
  <div>
    <asp:GridView ID="GridView" AutoGenerateColumns="false" runat="server">
      <Columns>
        <asp:TemplateField>
          <ItemTemplate>
            <asp:Label Text="<%# this.ValueDependingOnColumn1() %>" runat="server"></asp:Label>
          </ItemTemplate>
        </asp:TemplateField>
      </Columns>
    </asp:GridView>
  </div>
  </form>
</body>
</html>


Код

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using Table = System.Data.DataTable;

namespace WebApplication8
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            DataTable table = new DataTable();
            table.Columns.Add("Column1");
            table.Rows.Add(true);
            table.Rows.Add(false);

            this.GridView.DataSource = table;
            this.GridView.DataBind();
        }

        public string ValueDependingOnColumn1()
        {
            bool column1Value = Convert.ToBoolean(Eval("Column1"));
            if (column1Value)
                return "Труууу!";
            else
                return "Ненене...";
        }
    }
}


Свойство Text элемента Label теперь динамически формируется на основании значения Eval("Column1").
Стоит обратить внимание на то, что возвращаемое методом значение в любом случае интерпретируется как строка. Т. е. если бы метод возвращал, например, TextBox, выражение <%# this.MethodWhichReturnsTextBox() %> вернуло бы строку "System.Web.UI.WebControls.TextBox". В результате GridView состоял бы не из элементов TextBox, а из малосодержательных надписей.
Это чем-то напоминает WinForms'овские ListBox и ComboBox. Там тоже в Items можно хранить любые объекты, но отображается object.ToString(). Весьма печальное зрелище. Слава Богу, на смену WinForms пришел WPF smile

2. Перехватить метод RowDataBound
Код

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication8._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title>Untitled Page</title>
</head>
<body>
  <form id="form1" runat="server">
  <div>
    <asp:GridView ID="GridView" AutoGenerateColumns="false" runat="server">
      <Columns>
        <asp:TemplateField>
          <ItemTemplate>
            <asp:Label ID="Label" runat="server">
            </asp:Label>
          </ItemTemplate>
        </asp:TemplateField>
      </Columns>
    </asp:GridView>
  </div>
  </form>
</body>
</html>


Код

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using Table = System.Data.DataTable;

namespace WebApplication8
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            this.GridView.RowDataBound += new GridViewRowEventHandler(GridView_RowDataBound);

            DataTable table = new DataTable();
            table.Columns.Add("Column1");
            table.Rows.Add(true);
            table.Rows.Add(false);

            this.GridView.DataSource = table;
            this.GridView.DataBind();
        }

        void GridView_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                Label label = (Label) e.Row.Cells[0].FindControl("Label");

                bool column1Value = Convert.ToBoolean(DataBinder.Eval(e.Row.DataItem, "Column1"));
                if (column1Value)
                    label.Text = "Труууу";
                else
                    label.Text = "Ненене...";
            }
        }
    }
}

Очевидно, этот метод гораздо более гибкий. Правда, есть недостаток - обращение к ячейкам и контролам по индексам: малейшее изменение разметки сделает этот обработчик нерабочим. С этим приходится мириться.
Кстати, здесь есть еще одна интересная возможность.
Можно вот так не паритсья:
Код

bool column1Value = Convert.ToBoolean(DataBinder.Eval(e.Row.DataItem, "Column1"));

, получая каждое значение по отдельности через Reflection. Можно просто привести тип e.Row.DataItem. В случае баиндинга таблицы тип будет DataRowView. Тогда можно обращаться вот так:
Код

DataRowView row = (DataRowView)e.Row.DataItem;
string s = row["Column1"];

, не расходуя лишний раз процессорное время на Reflection.
Хотя это не самый лучший пример. Гораздо более очевидным приведение e.Row.DataItem является при баиндинге коллекции пользовательских типов:
Код

MyType myType = (MyType)e.Row.DataItem;
string name = myType.Name;
string surname = myType.Surname;
...


Все-все, закругляюсь smile
P. S. Я изложил свои видение баиндинга к DataGridView. Если у кого-то есть дополнения, буду рад ознакомиться.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Pankon
Дата 7.7.2008, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: 2
Всего: 5



Цитата(Idsa @  5.7.2008,  12:20 Найти цитируемый пост)
вставлять inline код в темплейт нельзя

Протестируйте такой код....
Код

<asp:TemplateField>
                <ItemTemplate>
                    <%
                        System.Threading.Thread.Sleep(500);
                        DateTime dt = DateTime.Now;
                        if (dt.Second % 2 == 0)
                        {
                    %>
                    2
                    <%
                        }
                        else
                        {
                    %>
                    1
                    <%
                        } %>
                </ItemTemplate>
</asp:TemplateField>


PM MAIL   Вверх
Idsa
Дата 7.7.2008, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Pankon, во как! Что-то я погорячился. Спасибо за поправку. +1.

Вам стоит посетить вот эту тему. Там есть несколько постов о том, что писать, используя <% , плохо (особенно в темплейтах). Подобную логику все-таки лучше реализовать в RowDataBound.

А в тему того, почему не работает код в первом посте... Дело в том, что <% выполняется на этапе рендеринга. Баиндинг же происходит раньше. Поэтому неудивительно, что вот такой код:
Код

<asp:GridView id="GridView" runat="server">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:Label ID="lbl1" runat="Server" Text='<%# Bind("Col_1") %>' />
<%
     int col2Value = (int)Eval("Col_2");
     if(col2Value == 5)
     {
       ;
     }
%>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>

вызывает InvalidOperationException с текстом "Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control.". Ну действительно, ведь Eval(string expression) - короткая запись DataBinding.Eval(object container, string expression)... а container определен только при binding'е.

Это сообщение отредактировал(а) Idsa - 7.7.2008, 18:35


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Любитель
Mymik
mr.DUDA

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Любитель, Mymik, mr.DUDA.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка под ASP.NET | Следующая тема »


 




[ Время генерации скрипта: 0.0451 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.