#c# #javascript #asp.net
#c# #javascript #asp.net
Вопрос:
У меня есть пользовательский элемент управления courses, который отображает все доступные курсы. В моем файле пользовательского управления я использую элемент управления repeater для отображения курсов. Все названия курсов отображаются как кнопки ссылок внутри itemtemplate. Я использую этот пользовательский элемент управления на странице с именем foo.aspx. Я использую функцию javascript для изменения цвета значения внутри itemtemplate при нажатии. При нажатии цвет меняется на секунду, но возвращается к исходному цвету. Кто-нибудь знает, что я здесь делаю не так?
Моя функция javascript.
<script>
function changeColor(e) {
e.style.color = "red";
}
</script>
<asp:LinkButton ID="LinkButton1" OnClientClick="return changeColor(this);" runat="server">LinkButton</asp:LinkButton>
Комментарии:
1. При
asp:LinkButton
asp:Repeater
щелчке внутри ваш повторитель вызоветOnItemCommand
этоPostBack
на вашей странице. При выполнении страницыPostBack
ваш HTML-код будет отображаться снова. Вот почемуLinkButton
цвет снова будет сброшен.2. @WillyLazuardi Спасибо за ответ. Есть ли способ это исправить?
3. Есть более простой способ сделать это, чем с помощью javascript, см. Мой ответ ниже
Ответ №1:
Как я уже сказал в вашем комментарии, будьте осторожны со страницей PostBack
.
Чтобы предотвратить LinkButton
сброс вашего цвета, я думаю, вам следует сохранить их внутри ViewState
Я не знаю, лучшее это решение или нет, но, по крайней мере, я попытался помочь 🙂
Вот aspx:
<asp:Repeater ID="myRepeater" OnItemCommand="myRepeater_ItemCommand" runat="server">
<ItemTemplate>
<asp:LinkButton ID="myLinkButton" runat="server" CommandName="CHANGE_COLOR" ForeColor="<%# System.Drawing.Color.FromName(Container.DataItem.ToString()) %>">Your Text</asp:LinkButton>
</ItemTemplate>
</asp:Repeater>
Вот код, лежащий в основе (C #):
Сначала создайте ViewState
(это ключ для предотвращения потери данных после PostBack
)
List<string> listData
{
set { ViewState["listData"] = value; }
get
{
if (ViewState["listData"] == null)
return new List<string>();
else
return (List<string>)ViewState["listData"];
}
}
При загрузке страницы:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
listData = new List<string>();
listData.Add("Blue");
listData.Add("Blue");
listData.Add("Blue");
}
myRepeater.DataSource = listData;
myRepeater.DataBind();
}
При нажатии на кнопку LinkButton
повторитель сработает OnItemCommand
protected void myRepeater_ItemCommand(object sender, RepeaterCommandEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
if (e.CommandName == "CHANGE_COLOR")
{
LinkButton linkButton = (LinkButton)e.Item.FindControl("myLinkButton");
if (linkButton.ForeColor != System.Drawing.Color.Red)
{
linkButton.ForeColor = System.Drawing.Color.FromName("Red");
listData[e.Item.ItemIndex] = "Red"; //This is the key! This will prevent your color reset, as we save them inside ViewState
}
else
{
linkButton.ForeColor = System.Drawing.Color.FromName("Blue");
listData[e.Item.ItemIndex] = "Blue";
}
}
}
}
Ответ №2:
Создайте два класса CSS и проверьте в своем повторителе, включена ли ссылка или отключена, и покажите класс css на основе этого условия, что-то вроде этого:
.ActiveLinkBtn
{
color:red;
font:bold 12px Tahoma;
}
.InActiveLinkBtn
{
color:blue;
}
Затем измените повторитель следующим образом
<asp:Repeater ID="rptPager" runat="server">
<ItemTemplate>
<asp:LinkButton ID="lnkPage" runat="server" Text='<%#Eval("Text") %>'
CommandArgument='<%# Eval("Value") %>'
Enabled='<%# Eval("Enabled") %>' OnClick="Page_Changed" CssClass='<%#
Convert.ToBoolean(Eval("Enabled")) ? "ActiveLinkBtn" :"InActiveLinkBtn"%>'>
</asp:LinkButton>
</ItemTemplate>
</asp:Repeater>
Вот изменение ссылочной ссылки ASP.NET Цвет кнопки ссылки при нажатии