3

私のGridViewは基本的に、データベース内のデータの要約バージョンを表示します。

私がやりたいのは、GridViewの行の任意の場所をクリックすると、GridViewを含むパネルを非表示にし、詳細を表示するパネルを表示するsetプロシージャを実行するように設定することです。クリックしたアイテム。

        <asp:Panel runat="server" ID="pnlList">
            <div class="rightalign">
                <asp:Label runat="server" ID="lblCount"></asp:Label>
            </div>

            <asp:GridView runat="server" ID="gvItems" DataKeyNames="mailid" 
                AutoGenerateColumns="false" onrowdatabound="gvItems_RowDataBound" 
                Width="100%" OnSelectedIndexChanged="gvItems_SelectedIndexChanged">
                <Columns>
                    <asp:TemplateField>
                        <ItemTemplate>
                            <asp:CheckBox runat="server" ID="chkSelect" />
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField>
                        <ItemTemplate>
                            <asp:Label runat="server" ID="lblStatus" Text='<%# DataBinder.Eval(Container.DataItem, "status") %>'></asp:Label>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:BoundField DataField="firstname" HeaderText="From" SortExpression="firstname" />
                    <asp:BoundField DataField="datesent" HeaderText="Date" SortExpression="datesent" DataFormatString="{0:yyyy/MM/dd HH:mm}" />
                    <asp:BoundField DataField="subject" HeaderText="Subject" SortExpression="subject" />
                </Columns>
            </asp:GridView>
        </asp:Panel>

        <asp:Panel runat="server" ID="pnlMail">
            <p>From: <asp:Label runat="server" ID="lblFrom"></asp:Label><br />
                Sent On: <asp:Label runat="server" ID="lblDate"></asp:Label><br />
                Subject: <asp:Label runat="server" ID="lblSubject"></asp:Label></p>
            <p><asp:Label runat="server" ID="lblMessage"></asp:Label></p>
        </asp:Panel>

イベントを使用することを考えましSelectedIndexChangedたが、実際にセルのクリックを発生させる方法がわかりません。

これが私が持っているコードです:

    protected void gvItems_SelectedIndexChanged(object sender, EventArgs e)
    {
        int index = gvItems.SelectedIndex;

        string mailid = gvItems.DataKeys[index].Value.ToString();

        getMailDetail(mailid);
        pnlMail.Visible = true;
    }

    protected void getMailDetail(string id)
    {
        int mailid = int.Parse(id);
        MySqlContext db = new MySqlContext();

        string sql = "select m.datesent, m.subject, m.message, u.firstname, u.lastname from mail m inner join users u on m.senderid = u.userid where m.mailid = @id";

        List<MySqlParameter> args = new List<MySqlParameter>();
        args.Add(new MySqlParameter() { ParameterName = "@id", MySqlDbType = MySqlDbType.Int32, Value = mailid });

        MySqlDataReader dr = db.getReader(sql, args);

        if (dr.HasRows)
        {
            dr.Read();

            lblFrom.Text = (string)dr["firstname"] + " " + (string)dr["lastname"];
            lblDate.Text = (string)dr["datesent"];
            lblSubject.Text = (string)dr["subject"];
            lblMessage.Text = (string)dr["message"];
        }
        dr.Close();
    }

行のセルをクリックして、必要な作業を実行するイベントを発生させるにはどうすればよいですか?

どんな助けでもありがたいです!

4

2 に答える 2

4

私はここで2つの可能な解決策を見ることができます。まず、クライアント側の行をクリックして処理し、HttpHandler必要なメールの詳細を返すAjaxリクエストを送信し、返された情報を表示します。これを達成するための手順:

クライアント側のハンドラーも行クリックに割り当てます。

protected void gvItems_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if(e.Row.RowType == DataControlRowType.DataRow)
    {
        e.Row.Attributes["onClick"] = "showMailDetails(" + DataBinder.Eval(e.Row.DataItem, "id") + ")";
    }
}

そして、クライアント側の機能を定義します。

function showMailDetails(mailId) {
    $.get(
        url: 'url to HttpHandler here',
        data: {id: mailId},
        success: function(data) {
            var pnlMail = $('#<%= pnlMail.ClientID %>');
            // display data here

            pnlMail.show()
    });   
}

もう1つの方法は、クライアント側でクリックを処理してから、RowCommand次のようにしてイベントをエミュレートすることです。

protected void gvItems_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if(e.Row.RowType == DataControlRowType.DataRow)
    {
        e.Row.Attributes["onClick"] = ""javascript:__doPostBack('" + gvItems.ClientID + "','MailDetailsCommand$" + DataBinder.Eval(e.Row.DataItem, "id") + "')";
    }
}

そして、サーバー側では、RowComamndハンドラーで、すでに行ったように実行します。

protected void gvItems_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName == "MailDetailsCommand") {
    // ...
    }
}

この方法はお勧めしませんが、_doPostBackmanullyの使用はベストプラクティスとは見なされていません。

于 2012-10-17T09:14:41.043 に答える
1

ボタンまたはボタンフィールドで構成されるテンプレートフィールドを指定すると、コマンド名を何かとして指定できます。次に、gridview commandeventargsを使用でき、コマンド名に基づいて、必要な操作を実行できます。また、OnRowCommandを使用して次のことを実行できます。イベントを発生させる:Dこれがあなたに役立つことを願っています....。

ボタンフィールドがないなどの制限がある場合は、RowDataBoundイベントのセルにonclick属性を追加することもできます。

于 2012-10-17T08:57:23.617 に答える