3

私はデータを動的に表示する方法を見つけようとしてきましたが、うまくいきませんでした。アラートシステム(SQL Server DBテーブルで構成されています)があり、そのテーブルの(関連する)行ごとに、ASPページに表示される文字列を作成し、チェックボックスを挿入する必要があります(ちょうどアラートを「既読」としてマークできます)。

私はすでにデータとすべてを持っていますが(私はそれを正しく行っていると思います)、私が望む方法でこのデータをページに表示することが完全にできませんでした。

C#コードは次のとおりです。

protected void getAlertas(string matricula)
{
    string query = "SELECT * FROM ALERTAS A ";
    query += "WHERE EXISTS ( ";
    query += "SELECT ID, MATRICULA FROM VEICULOS V WHERE V.MATRICULA = @matricula ";
    query += "AND A.IDVEICULO = V.ID ";
    query += "AND LIDA = 0)";

    SqlCommand comm = new SqlCommand(query, Utils.connectDB());
    matricula = matricula.ToString().Replace("\"", "'");
    comm.Parameters.AddWithValue("@matricula", matricula);

    StringBuilder builder = new StringBuilder();
    DataTable dt = new DataTable();
    SqlDataAdapter da = new SqlDataAdapter();
    StringCollection alertValues = new StringCollection();

    StringBuilder HTML = new StringBuilder();

    try
    {
        comm.Connection.Open();
        SqlDataReader reader = comm.ExecuteReader();
        dt.Load(reader);

        foreach (DataRow row in dt.Rows)
        {
            Label label = new Label();
            CheckBox cBox = new CheckBox();

            foreach (DataColumn column in dt.Columns)
            {
                alertValues.Add(row[column].ToString());
            }

            builder.Append(alertValues[0]); //ID do alerta
            builder.Append(":");

            builder.Append(matricula);

            if (int.Parse(alertValues[10]) == 0) //se motor desligado
            {
                //string output =  "Motor desligado às " + alertValues[3] + "do dia " + alertValues[4];
                builder.Append("Motor desligado às ");

            }
            else if(int.Parse(alertValues[10]) == 1) //se motor ligado
            {
                //string output = "Motor ligado às " + alertValues[3] + "do dia " + alertValues[4];
                builder.Append("Motor ligado às ");
            }

            builder.Append(alertValues[3]); //hora
            builder.Append("do dia ");
            builder.Append(alertValues[4]); //data

            //HTML.Append(" <div id=\"notifications\" runat=\"server\" class=\"notifications\">");
            //HTML.Append(" <div class=\"notificationText\">");
            //HTML.Append("<asp:Label ID=\"Label1\" runat=\"server\" Text=\"" + builder.ToString() + "\"></asp:Label>");
            //HTML.Append("</div>");
            //HTML.Append("<div class=\"setRead\">");
            //HTML.Append("<asp:CheckBox ID=\"" + alertValues[0] + "\" runat=\"server\" />");
            //HTML.Append("</div>");
            //HTML.Append("</div>");


            label.Text = builder.ToString();
            cBox.ID = alertValues[0];
        }
    }
    finally
    {
        comm.Connection.Close();
    }
}

そして、これが私がデータを提示したいASPページです:

<div id="contentRight">
        <div id="head">
            <p>
                <b>Notificações</b></p>
        </div>
        <div id="notifications" runat="server" class="notifications">
            <div class="notificationText">
                <asp:Label ID="Label1" runat="server" Text="Nada para mostrar"></asp:Label>
            </div>
            <div class="setRead">
                <asp:CheckBox ID="AlertIDRead" runat="server" />
            </div>
        </div>
        <hr />
        <div id="OkBtn" align="center">
            <asp:Button ID="OkButton" class="Button" runat="server" Text="Ok" />
        </div>
    </div>

目的は、作成された文字列をページに表示できるようにすることです。また、これらの行ごとに、(DB上の)alertIDと同じIDを持つチェックボックスを提供します。これは、次のようにマークするのを簡単にするためです。読む。

私はここで本当に迷子になっていて、助けを借りることができます。

4

1 に答える 1

1

アイテムを動的に追加できます。ただし、これは少し面倒です。ページを初めてロードするときだけでなく、毎回追加する必要があります。また、ポストバック間でビューステートを保持し、どのボックスがチェックされたかを記憶したい場合は、ページのライフサイクルの早い段階で(たとえば、Page_Initイベントで)それらを追加する必要があります。

より簡単なアプローチは、ListViewなどのコントロールを使用することです。ASP.NET 4.0では、必要なとおりにコントロール名を簡単に取得できますが、ASP.NET3.5で自動生成されたコントロール名で問題ない可能性があります。ASPXページがどのように表示されるかの例を次に示します。

<asp:ListView runat="server" ID="listView" DataKeyNames="AlertId">
    <LayoutTemplate>
        <div id="contentRight">
            <div id="head">
                <p>
                    <b>Notificações</b></p>
            </div>
            <div id="notifications" runat="server" class="notifications">
                <asp:PlaceHolder ID="itemPlaceholder" runat="server" />
            </div>
        </div>      
    </LayoutTemplate>
    <ItemTemplate>
        <div class="notificationText">
            <asp:Label ID="Label1" runat="server" Text='<%#Eval("AlertText")%>' />
        </div>
        <div class="setRead">
            <asp:CheckBox ID="AlertChecked" runat="server" />
        </div>
    </ItemTemplate>
</asp:ListView>
<hr />
<div id="OkBtn" align="center">
    <asp:Button ID="OkButton" class="Button" runat="server" Text="Ok" onclick="OkButton_Click" />
</div>
<asp:Label runat="server" ID="lblDisplay" />

そして、ここにいくつかのサンプルコードビハインドがあります。データアクセスコードをハードコードされたリストに置き換えたことに注意してください。これを、データベースからデータをロードするために必要なコードに置き換えても問題ないと思います。

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            // Creates a list of alerts and binds them to the list view.
            // You would use your sql data reader here instead.  You could convert the data
            // into a list or just bind the data reader directly to the list view.  If you
            // bind the data reader to the list view then be sure to update the Eval statements
            // in the list view templates.
            var alerts = new[]
            {
                new { AlertId = 1, AlertText = "This is alert #1."},
                new { AlertId = 2, AlertText = "This is the second alert."},
                new { AlertId = 3, AlertText = "This is the third alert."},
                new { AlertId = 5, AlertText = "This is alert #5."}
            };
            listView.DataSource = alerts;
            listView.DataBind();
        }
    }

    protected void OkButton_Click(object sender, EventArgs e)
    {
        // get the list of alerts that have been checked
        var checkedAlerts = new List<int>();
        foreach (var listViewItem in listView.Items)
        {
            var checkbox = (CheckBox)listViewItem.FindControl("AlertChecked");
            if (checkbox.Checked)
            {
                checkedAlerts.Add((int)listView.DataKeys[listViewItem.DataItemIndex].Value);
            }
        }
        // now do something to record them as read; we'll just display them in a label for this sample.
        lblDisplay.Text = "The following alerts were marked read: " + String.Join(",", checkedAlerts);
    }
于 2011-12-29T02:03:27.593 に答える