<asp:SqlDataSource ID="SqlDataSource2" SelectCommand="SELECT id, name FROM [group]" runat="server"
ConnectionString="<%$ ConnectionStrings:trainingConnectionString %>"> </asp:SqlDataSource>
Проблема с GridView
Суть:
1. Создал первый SqlDataSource:
Код:
2. Создал второй SqldataSource:
Код:
<asp:SqlDataSource ID="SqlDataSource3" SelectCommand="SELECT id, name FROM users" runat="server"
ConnectionString="<%$ ConnectionStrings:trainingConnectionString %>"> </asp:SqlDataSource>
ConnectionString="<%$ ConnectionStrings:trainingConnectionString %>"> </asp:SqlDataSource>
3. Создал таблицу:
Код:
<asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1"
AutoGenerateColumns="False" DataKeyNames="id" onRowDataBound="GridView1_RowDataBound" onSelectedIndexChanged="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>
AutoGenerateColumns="False" DataKeyNames="id" onRowDataBound="GridView1_RowDataBound" onSelectedIndexChanged="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();
}
}
{
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. И печатает он эти значения.
Если кто-нибудь сталкивался с данной проблемой пожалуйста помогите.
Код:
//...
if (e.Row.RowType == DataControlRowType.DataRow)
//...
if (e.Row.RowType == DataControlRowType.DataRow)
if (e.Row.RowState == DataControlRowState.Normal || e.Row.RowState == DataControlRowState.Alternate)
//...
if (e.Row.RowType == DataControlRowType.DataRow)
//...
if (e.Row.RowType == DataControlRowType.DataRow)
if (e.Row.RowState == DataControlRowState.Normal || e.Row.RowState == DataControlRowState.Alternate)
//...
Кстати значения в переменной id1 и id одинаковые, я грешу на элемент View, но незнмю чем его заменить. Может подскажите другой подход к данному вопросу:
Я хотел чтобы считывая данные из базы, они размещались в таблицы и каждому считанному элементу присваивались разные ссылки.
мне кажется что проблема только в логике работы вашего кода, да и код примера очень путаный, стороннему наблюдателю трудно разобраться. Не совсем понял какой элемент "View" идет речь? все что могу посоветовать - попробовать разобраться, как работает GridView на простом примере.
1. SqlDataSource:
Код:
<asp:SqlDataSource ID="SqlDataSource1" SelectCommand="SELECT id, name FROM users" runat="server"
ConnectionString="<%$ ConnectionStrings:trainingConnectionString %>"> </asp:SqlDataSource>
ConnectionString="<%$ ConnectionStrings:trainingConnectionString %>"> </asp:SqlDataSource>
2. Таблица объявлена:
Код:
<asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1" AutoGenerateColumns="False" DataKeyNames="id" onRowCreated="RowCreated">
<Columns>
<asp:TemplateField HeaderText="Имя">
<ItemTemplate>
<asp:HyperLink ID="name" runat="server" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<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;
}
}
{
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;
}
}
Конечно этот код не идеален, но будут производиться доработки его что бы он правильно работал при любых условиях.