В режиме редактирования одно из полей грида представляется в виде выпадающего списка возможных значений.
Все работает, но есть проблема. Как установить текущее значение в списке соответствующее значению поля.
Целый день ищу, ничего не получается.
На всякий случай ниже фрагмент этого поля:
Здравствуйте tamtam, Вы писали:
T>В режиме редактирования одно из полей грида представляется в виде выпадающего списка возможных значений. T>Все работает, но есть проблема. Как установить текущее значение в списке соответствующее значению поля. T>Целый день ищу, ничего не получается. T>На всякий случай ниже фрагмент этого поля:
T> <asp:TemplateColumn HeaderText="статья расходов"> T> <ItemTemplate> T> <asp:label id="BudgetType" runat="server"> T> <%# DataBinder.Eval(Container.DataItem, "budget_type")%> T> </asp:label> T> </ItemTemplate> T> <EditItemTemplate> T> <asp:DropDownList runat="server" T> ID="BudgetTypeList" T> DataSource="<%# BudgetTypeList()%>" T> DataTextField="descript" T> DataValueField="budget_type_id" T> > T> </asp:DropDownList> T> </EditItemTemplate> T> В DropDownList нужно выбрать строку соответствующую label
Привожу пример своего кода.
Нужно у грида обрабатывать событие ItemDataBound.
В моем случае DropDownList называется list.
Думаю все ясно.
private void Grid_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
DataRowView Dr = (DataRowView)e.Item.DataItem;
switch (e.Item.ItemType)
{
case ListItemType.EditItem:
{
if (((DropDownList)e.Item.FindControl("list")).Items.FindByText(Dr["NAME"].ToString())!=null)
{
((DropDownList)e.Item.FindControl("list")).Items.FindByText(Dr["NAME"].ToString()).Selected=true;
}
break;
}
K>Привожу пример своего кода. K>Нужно у грида обрабатывать событие ItemDataBound. K>В моем случае DropDownList называется list. K>Думаю все ясно. K> private void Grid_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e) K> { K> DataRowView Dr = (DataRowView)e.Item.DataItem; K> switch (e.Item.ItemType) K> { K> case ListItemType.EditItem: K> { K> if (((DropDownList)e.Item.FindControl("list")).Items.FindByText(Dr["NAME"].ToString())!=null) K> { K> ((DropDownList)e.Item.FindControl("list")).Items.FindByText(Dr["NAME"].ToString()).Selected=true; K> } K> break; K> }
K> } K> } K> }
спасибо, работает
только у меня не преобразование
DataRowView Dr = (DataRowView)e.Item.DataItem;
дает ошибку, пришлось сделать вот так
System.Data.Common.DbDataRecord Dr = (System.Data.Common.DbDataRecord)e.Item.DataItem;
интересно с чем это может быть связано?
не порекомендуете, что кроме MSDN можно почитать по теме?
Здравствуйте kocta, Вы писали:
K>Здравствуйте tamtam, Вы писали:
T>>В режиме редактирования одно из полей грида представляется в виде выпадающего списка возможных значений. T>>Все работает, но есть проблема. Как установить текущее значение в списке соответствующее значению поля. T>>Целый день ищу, ничего не получается. T>>На всякий случай ниже фрагмент этого поля:
K>Привожу пример своего кода. K>Нужно у грида обрабатывать событие ItemDataBound. K>В моем случае DropDownList называется list. K>Думаю все ясно. K> private void Grid_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e) K> { K> DataRowView Dr = (DataRowView)e.Item.DataItem; K> switch (e.Item.ItemType) K> { K> case ListItemType.EditItem: K> { K> if (((DropDownList)e.Item.FindControl("list")).Items.FindByText(Dr["NAME"].ToString())!=null) K> { K> ((DropDownList)e.Item.FindControl("list")).Items.FindByText(Dr["NAME"].ToString()).Selected=true; K> } K> break; K> }
K> } K> } K> }
Можно еще написать функцию, которая вернет для Dr["NAME"] его индекс и установить для DropDownList SelectedItem="<%#Func(Dr["NAME"])%>". Тогда ItemDataBound перекрывать не придется
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте TK, Вы писали:
TK>Здравствуйте kocta, Вы писали:
K>>Здравствуйте tamtam, Вы писали:
T>>>В режиме редактирования одно из полей грида представляется в виде выпадающего списка возможных значений. T>>>Все работает, но есть проблема. Как установить текущее значение в списке соответствующее значению поля. T>>>Целый день ищу, ничего не получается. T>>>На всякий случай ниже фрагмент этого поля:
K>>Привожу пример своего кода. K>>Нужно у грида обрабатывать событие ItemDataBound. K>>В моем случае DropDownList называется list. K>>Думаю все ясно. K>> private void Grid_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e) K>> { K>> DataRowView Dr = (DataRowView)e.Item.DataItem; K>> switch (e.Item.ItemType) K>> { K>> case ListItemType.EditItem: K>> { K>> if (((DropDownList)e.Item.FindControl("list")).Items.FindByText(Dr["NAME"].ToString())!=null) K>> { K>> ((DropDownList)e.Item.FindControl("list")).Items.FindByText(Dr["NAME"].ToString()).Selected=true; K>> } K>> break; K>> }
K>> } K>> } K>> }
TK>Можно еще написать функцию, которая вернет для Dr["NAME"] его индекс и установить для DropDownList SelectedItem="<%#Func(Dr["NAME"])%>". Тогда ItemDataBound перекрывать не придется
Пробовал писать и так !
Но во многоих случаях это вызывает ряд проблем (ели кому интересно могу описать).
Если использовать такую схему то приходится в конце концов прибегать к хеш таблицам а это не изящьно
Здравствуйте tamtam, Вы писали:
T>Здравствуйте kocta, Вы писали:
K>>Привожу пример своего кода. K>>Нужно у грида обрабатывать событие ItemDataBound. K>>В моем случае DropDownList называется list. K>>Думаю все ясно. K>> private void Grid_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e) K>> { K>> DataRowView Dr = (DataRowView)e.Item.DataItem; K>> switch (e.Item.ItemType) K>> { K>> case ListItemType.EditItem: K>> { K>> if (((DropDownList)e.Item.FindControl("list")).Items.FindByText(Dr["NAME"].ToString())!=null) K>> { K>> ((DropDownList)e.Item.FindControl("list")).Items.FindByText(Dr["NAME"].ToString()).Selected=true; K>> } K>> break; K>> }
K>> } K>> } K>> }
T>спасибо, работает T>только у меня не преобразование T>DataRowView Dr = (DataRowView)e.Item.DataItem; T>дает ошибку, пришлось сделать вот так T>System.Data.Common.DbDataRecord Dr = (System.Data.Common.DbDataRecord)e.Item.DataItem;
T>интересно с чем это может быть связано?
А какие reference ты подключаешь?
T>не порекомендуете, что кроме MSDN можно почитать по теме?
MSDN хорош!!!!!!! Там есть все ! Но ничего невозможно найти
Могу посоветовать: http://www.aspnetmania.com/ http://www.c-sharpcorner.com/
Здравствуйте kocta, Вы писали:
K>Здравствуйте TK, Вы писали:
TK>>Здравствуйте kocta, Вы писали:
K>>>Здравствуйте tamtam, Вы писали:
T>>>>В режиме редактирования одно из полей грида представляется в виде выпадающего списка возможных значений. T>>>>Все работает, но есть проблема. Как установить текущее значение в списке соответствующее значению поля. T>>>>Целый день ищу, ничего не получается. T>>>>На всякий случай ниже фрагмент этого поля:
K>>>Привожу пример своего кода. K>>>Нужно у грида обрабатывать событие ItemDataBound. K>>>В моем случае DropDownList называется list. K>>>Думаю все ясно. K>>> private void Grid_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e) K>>> { K>>> DataRowView Dr = (DataRowView)e.Item.DataItem; K>>> switch (e.Item.ItemType) K>>> { K>>> case ListItemType.EditItem: K>>> { K>>> if (((DropDownList)e.Item.FindControl("list")).Items.FindByText(Dr["NAME"].ToString())!=null) K>>> { K>>> ((DropDownList)e.Item.FindControl("list")).Items.FindByText(Dr["NAME"].ToString()).Selected=true; K>>> } K>>> break; K>>> }
K>>> } K>>> } K>>> }
TK>>Можно еще написать функцию, которая вернет для Dr["NAME"] его индекс и установить для DropDownList SelectedItem="<%#Func(Dr["NAME"])%>". Тогда ItemDataBound перекрывать не придется
K>Пробовал писать и так ! K>Но во многоих случаях это вызывает ряд проблем (ели кому интересно могу описать).
И каких?
K>Если использовать такую схему то приходится в конце концов прибегать к хеш таблицам а это не изящьно K>
Можно использовать кэширующую сборку
Да и потом, в гриде, что много записей и они сразу все редатируются?
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте TK, Вы писали:
TK>Здравствуйте kocta, Вы писали:
K>>Здравствуйте TK, Вы писали:
TK>>>Здравствуйте kocta, Вы писали:
K>>>>Здравствуйте tamtam, Вы писали:
T>>>>>В режиме редактирования одно из полей грида представляется в виде выпадающего списка возможных значений. T>>>>>Все работает, но есть проблема. Как установить текущее значение в списке соответствующее значению поля. T>>>>>Целый день ищу, ничего не получается. T>>>>>На всякий случай ниже фрагмент этого поля:
K>>>>Привожу пример своего кода. K>>>>Нужно у грида обрабатывать событие ItemDataBound. K>>>>В моем случае DropDownList называется list. K>>>>Думаю все ясно. K>>>> private void Grid_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e) K>>>> { K>>>> DataRowView Dr = (DataRowView)e.Item.DataItem; K>>>> switch (e.Item.ItemType) K>>>> { K>>>> case ListItemType.EditItem: K>>>> { K>>>> if (((DropDownList)e.Item.FindControl("list")).Items.FindByText(Dr["NAME"].ToString())!=null) K>>>> { K>>>> ((DropDownList)e.Item.FindControl("list")).Items.FindByText(Dr["NAME"].ToString()).Selected=true; K>>>> } K>>>> break; K>>>> }
K>>>> } K>>>> } K>>>> }
TK>>>Можно еще написать функцию, которая вернет для Dr["NAME"] его индекс и установить для DropDownList SelectedItem="<%#Func(Dr["NAME"])%>". Тогда ItemDataBound перекрывать не придется
K>>Пробовал писать и так ! K>>Но во многоих случаях это вызывает ряд проблем (ели кому интересно могу описать). TK>И каких?
Предположим такая ситуация:
Есть словарь данных (из которого заполняется DataList)вида:
MasterKey Некое поле
1 значение 1
2 значение 2
........................
N значение N
Мы заполняем DataList т.е.
text = значение1 , Value = 1 (MasterKey)
............................
text = значение N , Value = N (MasterKey)
Если последовательность MasterKey =1,2,3,4,5,6....N ненарушается то все нормально все работает
SelectedItem = SelecttedItem.Value
Но если пользователь изменил последовательность MasterKey = 1,2,5,6,7,8 (т.е редактировал словарь)
то тут это уже не работает.
SelectedItem != SelecttedItem.Value
Я сталкивался с такими проблемами.
K>>Если использовать такую схему то приходится в конце концов прибегать к хеш таблицам а это не изящьно :-) K>> TK>Можно использовать кэширующую сборку :-) TK>Да и потом, в гриде, что много записей и они сразу все редатируются? :)
K>Предположим такая ситуация: K>Есть словарь данных (из которого заполняется DataList)вида:
K>MasterKey Некое поле K> 1 значение 1 K> 2 значение 2 K>........................ K> N значение N
K>Мы заполняем DataList т.е. K> text = значение1 , Value = 1 (MasterKey) K> ............................ K> text = значение N , Value = N (MasterKey)
K>Если последовательность MasterKey =1,2,3,4,5,6....N ненарушается то все нормально все работает
K>SelectedItem = SelecttedItem.Value
K>Но если пользователь изменил последовательность MasterKey = 1,2,5,6,7,8 (т.е редактировал словарь) K>то тут это уже не работает. K> K>SelectedItem != SelecttedItem.Value
K>Я сталкивался с такими проблемами.
Так можно все необходимые данные вычитать в рамках одно транзакции... Хотя, если их
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.