2

我正在开发一个gridview,您可以在其中通过一个按钮下载多个文件。

这是我的网格视图:

<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,然后会下载 doc。这正是我想要的。但是,我注意到每当打开一个新页面时(在 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] on 不会打开)。我想一个 Response.Write 可以部署多次,但是,一个 ClientScript.RegisterStartupScript 可能只能执行一次。

我可以使用另一种方法来不更改页面的字母字体并单击一下即可打开多个文件吗?

或者我怎么能多次执行 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.

客户端脚本由其密钥和类型唯一标识。具有相同键和类型的脚本被认为是重复的。页面中只能注册一个具有给定类型和密钥对的脚本。尝试注册已注册的脚本不会创建该脚本的副本。 http://msdn.microsoft.com/en-us/library/asz8zsxy.aspx

您可以使用Guid.NewGuid()每次生成不同的密钥。你可能想使用

RegisterStartupScript(Type, String, String, Boolean)

反而。最后一个参数(布尔值)告诉它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);

这是错误的,因为两者的第三个参数相同

 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 页面的顶部输出。

您可以使用 aStringBuilderforeach DataRow循环中构建脚本,然后注册一次。

于 2012-09-21T16:42:19.617 回答
1

我知道我参加聚会有点晚了,但我需要完成同样的事情。知道@JaimeTorres 提供了必须有一个唯一键的知识,我只是制作了一个静态方法,您可以在其中传递页面和消息,并且该方法创建一个具有基本 Do.... 的任意“键”。循环并不断检查密钥,直到我们找到第一个尚未使用的密钥。然后它使用它来显示消息。对于我的目的来说工作得很好,如果他们找到这个答案,也许其他人可以利用它!

    /// <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 代码。

用法:每个 Webform 类,像这样扩展 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 回答