2

1つのボタンで複数のファイルをダウンロードできるグリッドビューを開発しています。

これが私のグリッドビューです:

<asp:GridView ID="grdvHistorialMensajes" runat="server" AllowPaging="True" 
                    AutoGenerateColumns="False" CellPadding="4" AllowSorting="true"
                    EmptyDataText="No Hay Mensajes Enviados" ForeColor="#333333" 
                    GridLines="None" CellSpacing="1" 
                    onpageindexchanging="grdvHistorialMensajes_PageIndexChanging" 
                    onrowcommand="grdvHistorialMensajes_RowCommand" 
                    onsorting="grdvHistorialMensajes_Sorting">
                    <AlternatingRowStyle BackColor="White" ForeColor="#284775" />

                    <Columns>
                        <asp:BoundField DataField="CorreoCliente" HeaderText="Correo Del Cliente" SortExpression="CorreoCliente" />
                        <asp:BoundField DataField="CorreosAdicionales" HeaderText="Correos Adicionales" SortExpression="CorreosAdicionales" />
                        <asp:BoundField DataField="Tema" HeaderText="Tema" SortExpression="Tema" />
                        <asp:BoundField DataField="Mensaje" HeaderText="Mensaje" SortExpression="Mensaje" />

                        <asp:TemplateField HeaderText="Fecha" SortExpression="Fecha">
                            <ItemTemplate>
                                <%# DataBinder.Eval(Container.DataItem, "Fecha", "{0:dd/MM/yyyy}")%>
                            </ItemTemplate>

                            <EditItemTemplate>
                                <asp:TextBox ID="tbxFecha" runat="server" Text='<%#Bind("Fecha","{0:dd/MM/yyyy}") %>' ValidationGroup="gpEdicionAgenda">
                                </asp:TextBox>
                            </EditItemTemplate>
                        </asp:TemplateField>

                        <asp:BoundField DataField="Hora" HeaderText="Hora" SortExpression="Hora" />
                        <asp:BoundField DataField="Archivos" HeaderText="Archivos" SortExpression="Archivos" />

                        <asp:TemplateField>
                            <ItemTemplate>
                                <asp:ImageButton ID="imgBtnDescargarArchivos" runat="server" 
                                    CommandArgument='<%# Eval("IdMensaje")%>' CommandName="Descargar" Height="16px" 
                                    ImageUrl="~/img/activar.png" ToolTip="Descargar" Width="16px" />
                            </ItemTemplate>
                        </asp:TemplateField>

                        <asp:TemplateField>
                            <ItemTemplate>
                                <asp:ImageButton ID="imgBtnVerMas" runat="server" 
                                    CommandArgument='<%# Eval("IdMensaje")%>' CommandName="VerMas" Height="16px" 
                                    ImageUrl="~/img/search.png" ToolTip="Ver Mas" Width="16px" />
                            </ItemTemplate>
                        </asp:TemplateField>
                    </Columns>

                    <EditRowStyle BackColor="#999999" />
                    <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                    <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                    <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
                    <RowStyle BackColor="#F7F6F3" ForeColor="#333333" HorizontalAlign="Center" />
                    <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
                    <SortedAscendingCellStyle BackColor="#E9E7E2" />
                    <SortedAscendingHeaderStyle BackColor="#506C8C" />
                    <SortedDescendingCellStyle BackColor="#FFFDF8" />
                    <SortedDescendingHeaderStyle BackColor="#6F8DAE" />
                </asp:GridView>

「Descargar」RowCommandをクリックするたびに、私は元々これを使用していました。

if (e.CommandName == "Descargar")
            {
                DataTable dt = ConexionBD.GetInstanciaConexionBD().GetArchivosPorMensaje(Convert.ToInt32(e.CommandArgument));

                foreach (DataRow dr in dt.Rows)
                {
                    string strArchivo = dr["Nombre"].ToString();
                    string strExtension = Path.GetExtension(strArchivo).ToLower();
                    Response.Write("<script>window.open('/Archivos/" + strArchivo + "');</script>");
                }
            }

クリックしたときに、その行に1 pdf、1 jpg、1 docがあるとすると、pdfとjpgの両方が別のウィンドウで開き、ドキュメントがダウンロードされます。それがまさに私が欲しいものです。ただし、新しいページを開くたびに(pdfおよびjpgの場合)、ページ内のすべてのフォントが変更されることに気付きました。だから私は解決策を見つけたかったので、これを試しました:

if (e.CommandName == "Descargar")
            {
                DataTable dt = ConexionBD.GetInstanciaConexionBD().GetArchivosPorMensaje(Convert.ToInt32(e.CommandArgument));

                foreach (DataRow dr in dt.Rows)
                {
                    string strArchivo = dr["Nombre"].ToString();
                    string strExtension = Path.GetExtension(strArchivo).ToLower();
                    ClientScript.RegisterStartupScript(this.GetType(), "myFileOpenScript", "<script>window.open('/Archivos/" + strArchivo + "');</script>");
                }
            }

pdfファイルを開くと、今回はフォントが変更されませんが、int dt.Rows [0]に表示される最初のファイルのみが開き/ダウンロードされます(dt.Rows [1]は開きません)。Response.Writeは複数回デプロイできると思いますが、ClientScript.RegisterStartupScriptはおそらく1回しか実行できません。

ページの文字フォントを変更せず、ワンクリックで複数のファイルを開くために使用できる別の方法はありますか?

または、ClientScript.RegisterStartupScriptを複数回実行するにはどうすればよいですか?

前もって感謝します

4

6 に答える 6

15

少し余分な情報が役立つでしょう。RegisterStatupScriptを複数回使用することは制限されていませんが、同じタイプ/キーの組み合わせを複数回登録することは制限されています(これは機能であり、制限ではありません)。

別のスクリプトを登録する必要がある場合は、一意のキーを使用してください。単にポストバックを実行している場合は、起動スクリプトの再登録が機能するか、機能するはずです。

http://msdn.microsoft.com/en-us/library/system.web.ui.clientscriptmanager.aspx

于 2012-09-21T16:34:12.643 に答える
8
ClientScript.RegisterStartupScript(this.GetType(),
    "myFileOpenScript",
    "<script>window.open('/Archivos/" + strArchivo + "');</script>");

ここでのスクリプトキーはですmyFileOpenScript

クライアントスクリプトは、そのキーとタイプによって一意に識別されます。同じキーとタイプのスクリプトは重複と見なされます。このページに登録できるのは、特定のタイプとキーのペアを持つ1つのスクリプトのみです。すでに登録されているスクリプトを登録しようとしても、スクリプトの複製は作成されません。 http://msdn.microsoft.com/en-us/library/asz8zsxy.aspx

を使用Guid.NewGuid()して、毎回異なるキーを生成できます。そして、あなたはおそらく使用したいと思うでしょう

RegisterStartupScript(Type, String, String, Boolean)

代わりは。最後のパラメーター(ブール値)は、scriptタグを作成するように指示しているため、scriptパラメーターには、タグを気にせずにコードのみを含めることができます。

于 2012-09-21T16:41:13.283 に答える
3

ジェイミー・トーレスの答えには例がないので

正解です

ScriptManager.RegisterStartupScript(Page, GetType(), "setDatePickerStartDate", "javascript:setDatePickerStartDate('" + s_capstoneStartDate + "'); ", true);
ScriptManager.RegisterStartupScript(Page, GetType(), "setDatePickerEndDate", "javascript:setDatePickerEndDate('" + s_capstoneEndDate + "'); ", true);

3番目のパラメーターは両方で同じであるため、これは間違っています

 ScriptManager.RegisterStartupScript(Page, GetType(), "Javascript", "javascript:setDatePickerStartDate('" + s_StartDate + "'); ", true);
 ScriptManager.RegisterStartupScript(Page, GetType(), "Javascript", "javascript:setDatePickerEndDate('" + s_EndDate + "'); ", true);
于 2018-05-25T20:57:59.507 に答える
1

Response.Writeこのようなイベントハンドラーでの使用は避けてRenderください。ページライフサイクルのフェーズの前に実行されるため、HTMLページの上部に出力されます。

を使用StringBuilderしてループ内でスクリプトを作成し、foreach DataRowそれを1回登録することができます。

于 2012-09-21T16:42:19.617 に答える
1

パーティーに少し遅れていることは知っていますが、同じことを成し遂げる必要がありました。@JaimeTorresが一意のキーが必要であると提供したことを知って、ページとメッセージを渡す静的メソッドを作成しました。このメソッドは、基本的なDo....Whileを使用して任意の「キー」を作成します。ループして、まだ使用されていない最初のキーが見つかるまでキーをチェックし続けます。次に、それを使用してメッセージを表示します。私の目的には問題なく機能します。この答えを見つけたら、他の誰かがそれを利用できるかもしれません。

    /// <summary>
    /// Shows a basic MessageBox on the passed in page
    /// </summary>
    /// <param name="page">The Page object to show the message on</param>
    /// <param name="message">The message to show</param>
    /// <returns></returns>
    public static ShowMessageBox(Page page, string message)
    {
        Type cstype = page.GetType();

        // Get a ClientScriptManager reference from the Page class.
        ClientScriptManager cs = page.ClientScript;

        // Find the first unregistered script number
        int ScriptNumber = 0;
        bool ScriptRegistered = false;
        do
        {
            ScriptNumber++;
            ScriptRegistered = cs.IsStartupScriptRegistered(cstype, "PopupScript" + ScriptNumber);
        } while (ScriptRegistered == true);

        //Execute the new script number that we found
        cs.RegisterStartupScript(cstype, "PopupScript" + ScriptNumber, "alert('" + message + "');", true);
    }
于 2020-06-11T15:30:30.370 に答える
0

私は通常、このメソッドを使用してアラートを表示し、必要なときにいつでも呼び出すことができます。

public class BasePage : System.Web.UI.Page {
        public void ShowNotif(string sMessage) {
            ScriptManager.RegisterStartupScript(Page, GetType(), Guid.NewGuid().ToString(), "alert('" + sMessage.Replace("'", "\'") + "'); ", true);
        }
}

これは、Javascriptコードを複数回実行できることを意味します。

使用法:すべてのWebフォームクラス、次のようにBasePageを拡張します:

public partial class FinanceHostToHost : BasePage{ //Not extend System.Web.UI.Page
....
}

関数呼び出し:

            ShowNotif("Hello");
            ShowNotif("World");
            ShowNotif("Any message");
            ShowNotif("Message again");
于 2019-01-14T09:41:41.347 に答える