Re: Как изменить контролы в репитере от условий
От: mogadanez Чехия  
Дата: 25.11.05 13:12
Оценка: 11 (2)
Здравствуйте, Saper, Вы писали:

S>Привет всем.


S>У меня возникла такая ситуация/вопрос. На странице есть репитер, в зависимости от условия авторизован пользователь на сайте или нет, хотелось бы в последнем столбце репитера либо ставить Label прочерк (нет прав ввода), либо, если пользователь уже авторизован, то показывать там поле ввода и кнопку, по клику которой я хотел бы ловить от него введённые значения.


S>Есть пути это реализовать ?


namespace metacomm.webcontrols
{
    using System;
    using System.Collections;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    [PersistChildren(true), ParseChildren(false)]
    public class switch_panel : PlaceHolder
        {       
        public int shown_control_index
            {
            get { 
                Control[] cls = get_non_literal_controls( this.Controls );
                for ( int i = 0; i < cls.Length; ++i )
                    if ( cls[i] == shown_control_ )
                        return i;
                return -1;                        
                }
            set {
                show_control( value == -1
                    ? null
                    : get_non_literal_controls( this.Controls )[ value ] );
                }
            }
            
        private void show_control( Control control )
            {
            Control[] non_literal_controls = get_non_literal_controls( this.Controls );
            foreach ( Control c in non_literal_controls )
                {
                if ( c == control ) shown_control_ = c;
                c.Visible = c == control;
                }
            }
            
        private static Control[] get_non_literal_controls( ControlCollection controls )
            {
            ArrayList r = new ArrayList();
            
            foreach( Control c in controls )
                // They are usually just a whitespace
                if ( c as LiteralControl == null )
                    r.Add( c );
                    
            return (Control[])r.ToArray( typeof( Control ) );
            }
            
        private Control     shown_control_;
        }
}




<ItemTemplate>
   <my:switch_panel  runat=server  shown_control_index="<%#Page.User.Identity.IsAuthenticated ? 0 : 1 %>" >
        <asp:Label  runat=server text="----"/>
        <asp:Placeholder runat=server><asp:TextBox runat=server/><asp:Button runat=server/></asp:Placeholder>
     </my:switch_panel>
</ItemTemplate>
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Как изменить контролы в репитере от условий
От: Saper Россия www.saper.ru
Дата: 25.11.05 12:43
Оценка:
Привет всем.

У меня возникла такая ситуация/вопрос. На странице есть репитер, в зависимости от условия авторизован пользователь на сайте или нет, хотелось бы в последнем столбце репитера либо ставить Label прочерк (нет прав ввода), либо, если пользователь уже авторизован, то показывать там поле ввода и кнопку, по клику которой я хотел бы ловить от него введённые значения.

Есть пути это реализовать ?
Re: Как изменить контролы в репитере от условий
От: Аноним  
Дата: 25.11.05 12:58
Оценка:
Здравствуйте, Saper, Вы писали:

S>Привет всем.


S>У меня возникла такая ситуация/вопрос. На странице есть репитер, в зависимости от условия авторизован пользователь на сайте или нет, хотелось бы в последнем столбце репитера либо ставить Label прочерк (нет прав ввода), либо, если пользователь уже авторизован, то показывать там поле ввода и кнопку, по клику которой я хотел бы ловить от него введённые значения.


S>Есть пути это реализовать ?


Есть событие ItemDataBound. Можно при биндинге сделать с элементом все,что угодно.

<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">
</asp:Repeater>

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
// Здесь проверяешь условие и пишешь то, что тебе нужно.
}

удачи.
Re[2]: Как изменить контролы в репитере от условий
От: Saper Россия www.saper.ru
Дата: 25.11.05 13:26
Оценка:
Здравствуйте, mogadanez, Вы писали:

M>
M><ItemTemplate>
M>   <my:switch_panel  runat=server  shown_control_index="<%#Page.User.Identity.IsAuthenticated ? 0 : 1 %>" >
M>        <asp:Label  runat=server text="----"/>
M>        <asp:Placeholder runat=server><asp:TextBox runat=server/><asp:Button runat=server/></asp:Placeholder>
M>     </my:switch_panel>
M></ItemTemplate>
M>


Отлично. Поражён вашим подходом, буду учиться мыслить так же. Это пять, т.е. три ... балла, максимум вобщем
Re[3]: Как изменить контролы в репитере от условий
От: excorp  
Дата: 25.11.05 15:48
Оценка:
Здравствуйте, Saper, Вы писали:

S>Здравствуйте, mogadanez, Вы писали:


M>>
M>><ItemTemplate>
M>>   <my:switch_panel  runat=server  shown_control_index="<%#Page.User.Identity.IsAuthenticated ? 0 : 1 %>" >
M>>        <asp:Label  runat=server text="----"/>
M>>        <asp:Placeholder runat=server><asp:TextBox runat=server/><asp:Button runat=server/></asp:Placeholder>
M>>     </my:switch_panel>
M>></ItemTemplate>
M>>


S>Отлично. Поражён вашим подходом, буду учиться мыслить так же. Это пять, т.е. три ... балла, максимум вобщем


честно говоря не согласен.
ради такого писать отдельный контрол ненужно.
я бы сделал так:

<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">
    <ItemTemplate>
        <asp:Table ID="Table1" runat="server">
            <asp:TableRow>
                <asp:TableCell><%# Container.DataItem %></asp:TableCell>
                <asp:TableCell>
                    <asp:Placeholder id="labelplh" runat="server"><asp:Label ID="Label2" runat="server" text="----"/></asp:Placeholder>
                    <asp:Placeholder id="buttonplh" runat="server"><asp:TextBox ID="TextBox2" runat="server"/><asp:Button ID="Button2" runat="server"/></asp:Placeholder>
                </asp:TableCell>
            </asp:TableRow>
        </asp:Table>
    </ItemTemplate>
</asp:Repeater>


using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Web.UI.MobileControls;
using System.Collections.Generic;

public partial class Default2 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        List<string> test = new List<string>();
        test.Add("test1");
        test.Add("test2");
        test.Add("test3");
        test.Add("test4");
        test.Add("test5");
        test.Add("test6");

        Repeater1.DataSource = test;
        Repeater1.DataBind();
    }

    protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if ((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType == ListItemType.AlternatingItem))
        {
            if (User.Identity.IsAuthenticated)
            {
                ((PlaceHolder)e.Item.FindControl("labelplh")).Visible = false;
                ((PlaceHolder)e.Item.FindControl("buttonplh")).Visible = true;
            }
            else
            {
                ((PlaceHolder)e.Item.FindControl("labelplh")).Visible = true;
                ((PlaceHolder)e.Item.FindControl("buttonplh")).Visible = false;
            }
        }
    }
}
Re[4]: Как изменить контролы в репитере от условий
От: mogadanez Чехия  
Дата: 25.11.05 16:15
Оценка:
Здравствуйте, excorp, Вы писали:

E>честно говоря не согласен.

E>ради такого писать отдельный контрол ненужно.
E>я бы сделал так:

E>
skip
E>


E>
skip
E>


бееее....

ужасно... везде где понадобиться такая функциональность писать так? фу....

более того такой контрол применим не толко здесь... он писался не ДЛЯ ЭТОГО.
например поисковая страница, когда найдено чтото показываем грид, не найдено div с текстом "Нифига не нашли".

 <my:switch_panel  runat=server id = switch_>
      <asp:dataGrid ...../>
        <asp:Panel>"Нифига не нашли"</asp:Panel>
 </my:switch_panel>




void do_find()
{
  IList  res = find( ... );  
    switch_.selected_item_index = res.Count >0 ? 1: 0;
    .....
}


еще пример, есть DropDown с 5 пунктами .... надо в зависимости от выбранного показывать выбранную панель



P.S. Мелко мыслите.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re[5]: Как изменить контролы в репитере от условий
От: excorp  
Дата: 25.11.05 17:31
Оценка:
Здравствуйте, mogadanez, Вы писали:

M>Здравствуйте, excorp, Вы писали:


E>>честно говоря не согласен.

E>>ради такого писать отдельный контрол ненужно.
E>>я бы сделал так:

E>>
M>skip
E>>


E>>
M>skip
E>>


M>бееее....


M>ужасно... везде где понадобиться такая функциональность писать так? фу....


M>более того такой контрол применим не толко здесь... он писался не ДЛЯ ЭТОГО.

M>например поисковая страница, когда найдено чтото показываем грид, не найдено div с текстом "Нифига не нашли".

M>
M> <my:switch_panel  runat=server id = switch_>
M>      <asp:dataGrid ...../>
M>        <asp:Panel>"Нифига не нашли"</asp:Panel>
M> </my:switch_panel>
M>



M>

M>void do_find()
M>{
M>  IList  res = find( ... );  
M>    switch_.selected_item_index = res.Count >0 ? 1: 0;
M>    .....
M>}

M>


M>еще пример, есть DropDown с 5 пунктами .... надо в зависимости от выбранного показывать выбранную панель


M>P.S. Мелко мыслите.


хм...

Наверняка Вы правы, а я — нет.

Подумал тут, что было бы удобнее определять показываемый контрол не по индексу, а по идентификатору.
Вот что получилось (извиняюсь за извращение Вашего кода):


<asp:Repeater ID="Repeater1" runat="server">
    <ItemTemplate>
        <asp:Table ID="Table1" runat="server">
            <asp:TableRow>
                <asp:TableCell><%# Container.DataItem %></asp:TableCell>
                <asp:TableCell>
                    <aut:SwitchPanel ShowControlId='<%# Page.User.Identity.IsAuthenticated ? "buttonplh" : "Label2" %>' runat="server">
                        <asp:Label ID="Label2" runat="server" text="----"/>
                        <asp:Placeholder id="buttonplh" runat="server">
                            <asp:TextBox ID="TextBox2" runat="server"/><asp:Button ID="Button2" runat="server"/>
                        </asp:Placeholder>
                    </aut:SwitchPanel>
                </asp:TableCell>
            </asp:TableRow>
        </asp:Table>
    </ItemTemplate>
</asp:Repeater>



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Collections;

namespace excorp.controls
{
    [ToolboxData("<{0}:SwitchPanel runat=server></{0}:SwitchPanel>"), PersistChildren(true), ParseChildren(false)]
    public class SwitchPanel : PlaceHolder
    {
        private Control shownControl;

        public string ShowControlId
        {
            get
            {
                return ((shownControl != null) ? shownControl.ID : string.Empty);
            }
            set
            {
                ShowControl(this.FindControl(value));
            }
        }

        private void ShowControl(Control control)
        {
            Control[] nonLiteralControls = GetNonLiteralControls(this.Controls);
            foreach (Control c in nonLiteralControls)
            {
                if (c == control)
                    shownControl = c;
                c.Visible = c == control;
            }
        }

        private static Control[] GetNonLiteralControls(ControlCollection controls)
        {
            ArrayList r = new ArrayList();

            foreach (Control c in controls)
             //They are usually just a whitespace
                if (c as LiteralControl == null)
                    r.Add(c);

            return (Control[])r.ToArray(typeof(Control));
        }
    }
}


Каковы плохие стороны данного контрола?

Только опять сильно не пинайте!


P.S. Я не мелко мыслю, просто стараюсь не стрелять из пушки по воробьям... и иногда перегибаю палку
Re[6]: Как изменить контролы в репитере от условий
От: mogadanez Чехия  
Дата: 25.11.05 22:40
Оценка:
E>Каковы плохие стороны данного контрола?

E>Только опять сильно не пинайте!


да никаких, у каждого свои use cases. В нашем случае удобнее индекс( пример с дропдауном — индекс равен индексу в дропдауне ). Если вам больше подходят Id — бога ради
Re[7]: Как изменить контролы в репитере от условий
От: Аноним  
Дата: 26.11.05 09:39
Оценка:
Здравствуйте, mogadanez, Вы писали:


E>>Каковы плохие стороны данного контрола?


E>>Только опять сильно не пинайте!


M>да никаких, у каждого свои use cases. В нашем случае удобнее индекс( пример с дропдауном — индекс равен индексу в дропдауне ). Если вам больше подходят Id — бога ради


Спасибо за науку... и за контрол

Думаю он многим будет полезен.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.