Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с GridView

2.0K
13 октября 2008 года
nevile
138 / / 05.01.2007
Всем доброго дня. Возникла небольшая проблема с созданием GridView.
Суть:
1. Создал первый SqlDataSource:

 
Код:
<asp:SqlDataSource ID="SqlDataSource2" SelectCommand="SELECT id, name FROM [group]" runat="server"
        ConnectionString="<%$ ConnectionStrings:trainingConnectionString %>"> </asp:SqlDataSource>


2. Создал второй SqldataSource:

 
Код:
<asp:SqlDataSource ID="SqlDataSource3" SelectCommand="SELECT id, name FROM users" runat="server"
        ConnectionString="<%$ ConnectionStrings:trainingConnectionString %>"> </asp:SqlDataSource>


3. Создал таблицу:

Код:
<asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1"
        AutoGenerateColumns="False" DataKeyNames="id" &#111;&#110;RowDataBound="GridView1_RowDataBound" &#111;&#110;SelectedIndexChanged="GridView1_SelectedIndexChanged">
        <Columns>
           
            <asp:TemplateField HeaderText="Имя">
                <EditItemTemplate>
                     <asp:DropDownList ID="NameDropDownList" runat="server" DataSourceID="SqlDataSource3" DataValueField="id" DataTextField="name" SelectedValue=<%#Bind("id") %>>
                     </asp:DropDownList >
                </EditItemTemplate>
            <ItemTemplate>    
                <asp:HyperLink ID="name" runat="server" />
            </ItemTemplate>
            </asp:TemplateField>
           
           
            <asp:TemplateField HeaderText="Группа">
                <EditItemTemplate>
                     <asp:DropDownList  ID="CatDropDownList" runat="server" DataSourceID="SqlDataSource2" DataValueField="id" DataTextField="name" SelectedValue=<%#Bind("id") %>>
                     </asp:DropDownList >
                </EditItemTemplate>
            <ItemTemplate>
               
                <asp:HyperLink ID="group" runat="server" />
            </ItemTemplate>
            </asp:TemplateField>

        </Columns>
    </asp:GridView>


4. В обработчике onRowDataBound="GridView1_RowDataBound" написал следующий код:

Код:
protected void GridView1_RowDataBound(object sender,GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            // получаю данные из SqlDataSource3
            System.Data.DataView ds1 = (System.Data.DataView)SqlDataSource3.Select(DataSourceSelectArguments.Empty);
            // получаю значение текущей категории
            System.Data.DataRowView view1 = (System.Data.DataRowView)e.Row.DataItem;
            int id1 = (int)view1.Row[3];
            //для проверки вывожу значение категории.
            Response.Write(id1.ToString());

            HyperLink name = (HyperLink)e.Row.FindControl("name");
            name.Text = ds1[id1 - 1].Row["name"].ToString();
        }
       
        if (e.Row.RowType == DataControlRowType.DataRow)
            if (e.Row.RowState == DataControlRowState.Normal || e.Row.RowState == DataControlRowState.Alternate)
            {
                // получаю данные из SqlDataSource2
                System.Data.DataView ds =(System.Data.DataView) SqlDataSource2.Select(DataSourceSelectArguments.Empty);
                // получаю значение текущей категории
                System.Data.DataRowView view = (System.Data.DataRowView)e.Row.DataItem;
                int id = (int)view.Row[3];

                HyperLink group = (HyperLink)e.Row.FindControl("group");
                group.Text = ds[id-1].Row["name"].ToString();

            }
    }


При считывании данных из SqldataSource2 все работает правильно и правильно вставляет, но когда считывает данные из SqlDataSource3, то получается так что id1 = тому что id который считан с помощью SqlDataSource2. И печатает он эти значения.

Если кто-нибудь сталкивался с данной проблемой пожалуйста помогите.
400
14 октября 2008 года
ArtemS2006
272 / / 12.01.2008
По моему мнению нужно просто устранить бардак в коде, в первую очередь избавиться от этой конструкции

 
Код:
//...
if (e.Row.RowType == DataControlRowType.DataRow)
//...
        if (e.Row.RowType == DataControlRowType.DataRow)
            if (e.Row.RowState == DataControlRowState.Normal || e.Row.RowState == DataControlRowState.Alternate)
//...
2.0K
14 октября 2008 года
nevile
138 / / 05.01.2007
Бардак в коде возможен, но мало вероятен (эту конструкцию каюсь оставил с первоначального варианта этого кода) Удалив данную конструкцию я получил то же самое. Так что она не играет особой роли.
Кстати значения в переменной id1 и id одинаковые, я грешу на элемент View, но незнмю чем его заменить. Может подскажите другой подход к данному вопросу:
Я хотел чтобы считывая данные из базы, они размещались в таблицы и каждому считанному элементу присваивались разные ссылки.
400
15 октября 2008 года
ArtemS2006
272 / / 12.01.2008
мне кажется что проблема только в логике работы вашего кода, да и код примера очень путаный, стороннему наблюдателю трудно разобраться. Не совсем понял какой элемент "View" идет речь? все что могу посоветовать - попробовать разобраться, как работает GridView на простом примере.
2.0K
15 октября 2008 года
nevile
138 / / 05.01.2007
Сделал все немного проще.

1. SqlDataSource:
 
Код:
<asp:SqlDataSource ID="SqlDataSource1" SelectCommand="SELECT id, name FROM users" runat="server"
        ConnectionString="<%$ ConnectionStrings:trainingConnectionString %>"> </asp:SqlDataSource>


2. Таблица объявлена:
Код:
<asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1" AutoGenerateColumns="False" DataKeyNames="id" &#111;&#110;RowCreated="RowCreated">
        <Columns>
           
            <asp:TemplateField HeaderText="Имя">

            <ItemTemplate>
        <asp:HyperLink ID="name" runat="server" />
            </ItemTemplate>
            </asp:TemplateField>
           
        </Columns>
    </asp:GridView>


3. обработчик RowCreated
Код:
protected void RowCreated(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            string name_str = (string)DataBinder.Eval(e.Row.DataItem,"name");
            int id_int = (int)DataBinder.Eval(e.Row.DataItem, "id");
           
                HyperLink name = (HyperLink)e.Row.FindControl("name");
                name.Text = name_str;
                name.NavigateUrl = "~/search?id=" + id_int;
        }
    }


Конечно этот код не идеален, но будут производиться доработки его что бы он правильно работал при любых условиях.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог