Проблемы с событиями в Asp.net - PullRequest
0 голосов
/ 04 ноября 2010

Я совершенно новичок в asp.net, и у меня возникли некоторые проблемы с ним.Я создал небольшую веб-форму для демонстрации и обучения, и у меня есть некоторые проблемы с ней.Надеюсь, вы можете помочь мне :)

Что я хочу, это:

  • , когда я нажимаю кнопку "Убить X" в таблице, я получаю сообщение "Вы нажали кнопку Убить X"в ярлыке "lblMsg".Я также хочу, чтобы я получал таблицу с новыми данными.
  • , когда я нажимаю кнопку «Загрузить», мне нужно получить дополнительные строки в таблице.Например, теперь, когда страница загружается, в таблице 10 строк, и когда я нажимаю «Загрузить», я нуждаюсь в том, чтобы получить дополнительные 10 строк в конце в той же таблице.

PS: я был бы благодарен занекоторое руководство по работе с событиями в asp.net.

Ниже приведен код:

WebForm1.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="HelpdeskOsControl.WebForm1" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
<asp:Panel ID="Panel1" runat="server" Height="465px" Width="417px">
    <asp:Table ID="Processes" runat="server" Height="20px" Width="400px" CssClass="tablesorter">
        <asp:TableHeaderRow ID="ProcessesHeader" runat="server" 
        TableSection="TableHeader">
            <asp:TableHeaderCell ID="TableHeaderCell1" runat="server">Name</asp:TableHeaderCell>
            <asp:TableHeaderCell ID="TableHeaderCell2" runat="server">CPU</asp:TableHeaderCell>
            <asp:TableHeaderCell ID="TableHeaderCell3" runat="server">Memory</asp:TableHeaderCell>
            <asp:TableHeaderCell ID="TableHeaderCell4" runat="server"></asp:TableHeaderCell>
        </asp:TableHeaderRow>
    </asp:Table>
    <asp:Panel ID="Panel2" runat="server">
        <asp:Button ID="btnLoad" runat="server" onclick="btnLoad_Click" Text="Load" />
        <asp:Button ID="btnClear" runat="server" onclick="btnClear_Click" 
            Text="Clear" />
        <asp:Label ID="lblMsg" runat="server" Text="Label"></asp:Label>
    </asp:Panel>
</asp:Panel>
    </form>
</body>
</html> 

WebForm1.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace HelpdeskOsControl
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
                GenerateTable(getTestData());
        }

        private List<string> getTestData()
        {
            List<string> tData = new List<string>();
            Random rand = new Random();
            for (int i = 0; i < 10; i++)
            {
                tData.Add("proc" + i + "_" + rand.Next(100) + "_" + rand.Next(100));
            }

            return tData;
        }

        protected void btnClear_Click(object sender, EventArgs e)
        {
            for (int i = Processes.Rows.Count; i > 1; i--)
            {
                Processes.Rows.RemoveAt(i - 1);
            }
        }

        protected void btnLoad_Click(object sender, EventArgs e)
        {
            GenerateTable(getTestData());
        }

        protected void btnKill_Click(object sender, EventArgs e)
        {
            lblMsg.Text = "You pressed button " + ((Button)sender).Text;
        }

        private void GenerateTable(List<string> list)
        {
            int st = 0;
            foreach (string line in list)
            {
                TableRow tr = new TableRow();
                Processes.Controls.Add(tr);

                foreach (String str in line.Split('_'))
                {
                    int index = tr.Cells.Add(new TableCell());
                    tr.Cells[index].Text = str;
                }

                Button b = new Button();
                b.Text = "Kill " + st;
                b.ID = "btnKill_" + st;
                b.Click += new EventHandler(btnKill_Click);
                TableCell tc = new TableCell();
                tc.Controls.Add(b);
                tr.Cells.Add(tc);

                tr.TableSection = TableRowSection.TableBody;
                st++;
            }
            Processes.BorderStyle = BorderStyle.Solid;
            Processes.GridLines = GridLines.Both;
            Processes.BorderWidth = 2;
        }

    }
}-

Ответы [ 3 ]

2 голосов
/ 04 ноября 2010

Я понимаю, что вы впервые работаете с ASP.NET и хочу помочь вам узнать больше о его возможностях.

Прежде всего, я бы заменил написанный вами код на привязка данных Это способ легко создавать таблицы без необходимости писать методы, такие как ваш generateTable.ASP.NET заботится о создании таблицы самостоятельно.Мне потребуется некоторое время, чтобы проиллюстрировать вам полный код для достижения этой цели, но я надеюсь, что вы можете взять документацию и начать обучение с моей помощью.

Элемент управления ключом - GridView.Он может быть заполнен с использованием двухстрочного фрагмента кода

protected override OnLoad(EventArgs e)
{
    if (!IsPostback) DataBind();
}

protected override void OnDataBind(EventArgs e)
{
    gridView.DataSource = getTestData();
    gridView.DataBind();
}

Сначала необходимо настроить столбцы в макете.Статьи о GridView имеют дело с этим, и вы можете добавить кнопку для каждой строки.

Теперь,

вы можете установить кнопки как команда кнопки, таким образом, не тольковызывая событие Click , но, что более важно, событие Command , которое принимает имя и аргумент.Вот где вы можете ввести свой код.Например

<asp:Button id="btnSomething" CommandArgument="[procId]" CommandName="kill" OnCommand="myCommandHandler" />

protected void myCommandHandler(object sender, CommandEventArgs e)
{
    if (e.CommandName=="kill")
    {
        killProcess(e.CommandArgument);

        DataBind(); //MOST IMPORTANT
    }
}

Надеюсь на помощь.Я написал этот код от руки, поэтому, пожалуйста, поймите меня, если он не будет работать сразу

2 голосов
/ 04 ноября 2010

Необходимо сохранить состояние таблицы между загрузками страниц и восстановить его, поскольку динамические элементы управления не сохраняются между запросами.(Преимущество использования ListView, DataGrid и т. Д.).

public partial class WebForm1 : System.Web.UI.Page
{
    private List<string> CurrentTestData
    {
        get
        {
            if (ViewState["CurrentTestData"] == null)
                return new List<string>();
            else
                return (List<string>)ViewState["CurrentTestData"];
        }
        set
        {
            ViewState["CurrentTestData"] = value;
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            CurrentTestData = getTestData();
            GenerateTable(CurrentTestData);
        }
        else
            GenerateTable(CurrentTestData);
    }

    private List<string> getTestData()
    {
        List<string> tData = new List<string>();
        Random rand = new Random();
        for (int i = 0; i < 10; i++)
        {
            tData.Add("proc" + (CurrentTestData.Count + i) + "_" + rand.Next(100) + "_" + rand.Next(100));
        }

        return tData;
    }

    protected void btnClear_Click(object sender, EventArgs e)
    {
        ClearTheTable();
        CurrentTestData = null;
    }

    protected void btnLoad_Click(object sender, EventArgs e)
    {
        var CombinedTestData = CurrentTestData;
        CombinedTestData.AddRange(getTestData());
        CurrentTestData = CombinedTestData;
        GenerateTable(CurrentTestData);
    }

    protected void btnKill_Click(object sender, EventArgs e)
    {
        lblMsg.Text = "You pressed button " + ((Button)sender).Text;
    }

    private void GenerateTable(List<string> list)
    {
        ClearTheTable();

        int st = 0;
        foreach (string line in list)
        {
            TableRow tr = new TableRow();
            Processes.Controls.Add(tr);

            foreach (String str in line.Split('_'))
            {
                int index = tr.Cells.Add(new TableCell());
                tr.Cells[index].Text = str;
            }

            Button b = new Button();
            b.Text = "Kill " + st;
            b.ID = "btnKill_" + st;
            b.Click += new EventHandler(btnKill_Click);
            TableCell tc = new TableCell();
            tc.Controls.Add(b);
            tr.Cells.Add(tc);

            tr.TableSection = TableRowSection.TableBody;
            st++;
        }
        Processes.BorderStyle = BorderStyle.Solid;
        Processes.GridLines = GridLines.Both;
        Processes.BorderWidth = 2;
    }

    private void ClearTheTable()
    {
        for (int i = Processes.Rows.Count; i > 1; i--)
        {
            Processes.Rows.RemoveAt(i - 1);
        }
    }
}
0 голосов
/ 04 ноября 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...