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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> почему не меняется значение у CheckBox-а? 
V
    Опции темы
lankin
Дата 18.4.2009, 08:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Используется SqlDataSource и DetailsView. По кнопке "сохранить" связанные данные автоматом апдейтятся на базу.

Код

<body>
    <form id="form1" runat="server">
    <asp:LoginStatus ID="LoginStatus1" runat="server" LoginText="вход" LogoutText="выход"
        Style="text-decoration: underline; float: right" />
    <div>
        <asp:DetailsView ID="editAuto" runat="server" Width="500px" AutoGenerateRows="False" DataSourceID="autoSource" 
                    DefaultMode="Edit" DataKeyNames="id" CssClass="TableStyle">
              <Fields>
                <asp:TemplateField HeaderText="Цвет:">
                    <ItemTemplate>
                        <asp:CheckBox ID="checkMetallic" runat="server" Text="Металлик" />
                    </ItemTemplate>
                </asp:TemplateField>
             </Fields>
              <FooterTemplate>
                <asp:Button ID="SaveBtn" runat="server" Text="Сохранить" onclick="SaveBtn_Click"/> 
                <asp:Button ID="CancelBtn" runat="server" Text="Отменить" onclick="CancelBtn_Click" />  
              </FooterTemplate>
            </asp:DetailsView>
    </div>
        <asp:SqlDataSource ID="autoSource" runat="server" ConnectionString="<%$ ConnectionStrings:MyConnectionString %>"
                SelectCommand="P$get_for_moderation" SelectCommandType="StoredProcedure"
                UpdateCommand="P$update" UpdateCommandType="StoredProcedure">
              <SelectParameters>
                <asp:Parameter DefaultValue="0" Name="status_id" />
                <asp:QueryStringParameter QueryStringField="AutoAdId" Name="id" />
              </SelectParameters>
              <UpdateParameters>
                <asp:QueryStringParameter QueryStringField="AutoAdId" Name="id" />
              </UpdateParameters>
          </asp:SqlDataSource>
</form>
</body>


Код

protected void SaveBtn_Click(object sender, EventArgs e)
        {
            CheckBox cb;
            Parameter prmColorProperty = new Parameter("color_property",DbType.Int32);
            cb = (CheckBox)editAuto.FindControl("checkMetallic");
            if (cb.Checked) prmColorProperty.DefaultValue = "1";
         .....................
           autoSource.UpdateParameters.Add(prmColorProperty);
         }


В чем проблема: при формировании страницы есть чекбокс, который устанавливается, в зависимости от исходного значения.
НО: при нажатии "сохранить" значение чекбокса почему то всегда такое, какое было при формировании страницы. Хотя я мог его изменить на True, все равно оно будет False. Может я не правильно его извлекаю(через FindControl)?
PM MAIL   Вверх
Idsa
Дата 18.4.2009, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



lankin, это все проделки Web Forms...

Вот как развиваются события при постбэке:
1. DetailsView восстанавливается из ViewState
2. Присваиваются значения, пришедшие с постбэком (в частности, установлен ли CheckBox)
3. SqlDataSource загружает данные заново, при этом, естественно, теряется информация, выбран ли CheckBox.

Самый простой workaround - грузить данные единожды (при первом запросе страницы), а потом восстанавливать их из ViewState.
Для этого нужно убрать из разметки DetailsView значение DataSourceId и присваивать его в CodeBehind:
Код

protected void Page_PreRender(object sender, EventArgs e)
{
 if (!this.IsPostBack)
 {
  this.editAuto.DataSourceId = "autoSource";
 }
}

Не проверял, но должно сработать smile

Это сообщение отредактировал(а) Idsa - 18.4.2009, 11:50


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


Опытный
**


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

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



Если делать так, то в Page_Load у меня нельзя найти ни один контрол внутри DetailsView. Дело в том, что в базе значения для чекбоксов представлены в виде INT, поэтому я по Page_Load просто запросом достаю эти значения и подставляю чекбокс.Чекед = тру или фалсе исходя из того 1 или 0 в базе. Если можно как-то иначе подменять автоматом значения в DetailsView при событии OnSelect и избежать этого геммороя в Page_Load, то будет как раз то, что нужно.
PM MAIL   Вверх
Idsa
Дата 20.4.2009, 05:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



lankin, нужно просто эту логику пенести в PreRender_Complete: там баиндинг уже произойдет, и у Вас будет доступ к контролам DetailsView. А можно пойти другим путем: в Page_Load вместе с присвоением DataSourceId вызвать вручную DataBind - тогда баиндинг произойдет незамедлительно и, опять же, станут доступны контролы DetailsView.


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


Опытный
**


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

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



Вынес в Page_PreRenderComplite, все работает, большое спасибо! smile 
Такой вопрос: насколько целесообразно вынести эти преобразования (int -> bool) в хранимую процедуру?
PM MAIL   Вверх
lankin
Дата 20.4.2009, 07:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Сделал иначе: в SQLDataSource добавил поле для чекбокса, оно возвращает int(1 или 0). В aspx добавил такое
Код

<asp:CheckBox ID="checkMetallic" runat="server" Text="Металлик" Checked='<%# GetCheck(Convert.ToInt32(Eval("property"))) %>' />

и в CodeBеhind
Код

protected bool GetCheck(int i)
        {
            return i == 1;
        }

Вот и все. Не надо лишних запросов. smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Любитель
Mymik
mr.DUDA

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

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

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


 




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


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

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