ASP.Net GridView GridViewDeleteEventArgs.Keys vacío

Tengo siguiente Gridview:

<asp:GridView ID="GridView1" runat="server" CssClass="table" DataKeyNames="groupId"
          DataSource="<%# dsUserGroupsSelected %>" DataMember="Group" etc....>

y después de activar el controlador de eventos RowDeleting:

protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)

e.Keys está vacío. Además, en tiempo de ejecución si verifico

dsUserGroupsSelected.Group.PrimaryKey

está empacado con:

{System.Data.DataColumn[1]}
    [0]: {groupId}

por eso es realmente extraño para mí. ¿Me estoy perdiendo de algo? Tengo este tipo de solución:

int groupId = (int)GridView1.DataKeys[e.RowIndex].Value;

que funcionará bien, pero no puedo entender por qué e.Keys (y e.Values) estarían vacíos. ¿Algunas ideas?

preguntado el 09 de septiembre de 09 a las 05:09

También estoy buscando una resolución para esto. Si un usuario elimina un registro y luego presiona F5, se eliminará el siguiente registro. -

4 Respuestas

Parece que este comportamiento es intencional.

Desde http://forums.asp.net/p/1050092/2128091.aspx

Mirando en Reflector en Gridview.HandleDelete (), parece que e.Keys y e.Values ​​solo se completan si gridview.IsBoundUsingDataSourceID. Es decir, si configura el DataSource en el código, nada de esto funcionará. ¡Buena, Microsoft! ¿Podría haber sido útil mencionar eso en la ayuda tal vez ?? !! Lachlan

Edit:

Terminé haciendo mis propios objetos de datos y los puse en la carpeta app_code

ex.

public class CustomDataViews
{
    public class FileQuery
    {
        public class File
        {
            public DateTime CreatedDate { get; set; }
            public string FileName { get; set; }
            public string Path { get; set; }
            public void Delete() { }
        }

        public ArrayList GetFiles()
        {
            System.Collections.ArrayList files = new ArrayList();
            System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(HttpContext.Current.Server.MapPath("~/UserUpload/"));
            foreach (System.IO.FileInfo fi in (from a in di.GetFiles() orderby a.CreationTime descending select a))
            {
                File myFile = new File();
                myFile.CreatedDate = fi.CreationTime;
                myFile.FileName = fi.Name;
                myFile.Path = "/VACWeb/UserUpload/" + fi.Name;
                files.Add(myFile);
            }
            return files;
        }

        public void Delete(string FileName)
        {
            if (FileName != null)
            {
                string path = HttpContext.Current.Server.MapPath("~/UserUpload/") + FileName;
                if (System.IO.File.Exists(path))
                    System.IO.File.Delete(path);
            }
        }
    }
}

aspx

<asp:GridView ID="gvFiles" runat="server" AutoGenerateColumns="False" DataKeyNames="FileName"
    DataSourceID="ods1">
    <Columns>
        <cc:ExtendedCommandField DeleteConfirmationText="Are you sure you wish to delete this file?"
            DeleteText="Delete" ShowDeleteButton="true" />
        <asp:BoundField DataField="CreatedDate" HeaderText="Created Date" DataFormatString="{0:MM/dd/yyyy}" />
        <asp:BoundField DataField="FileName" HeaderText="File Name" />
        <asp:ImageField DataImageUrlField="Path" AlternateText="No Image" HeaderText="Image Preview"
            ControlStyle-Width="100px">
            <ControlStyle Width="100px" />
        </asp:ImageField>
        <asp:BoundField DataField="Path" HeaderText="Path" />
        <asp:HyperLinkField DataNavigateUrlFields="Path" DataTextField="FileName" HeaderText="Link" />
    </Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ods1" runat="server" DeleteMethod="Delete" SelectMethod="GetFiles"
    TypeName="CustomDataViews+FileQuery">
    <DeleteParameters>
        <asp:Parameter Name="FileName" Type="String" />
    </DeleteParameters>
</asp:ObjectDataSource>

respondido 23 mar '15, 21:03

¡Simple! ASP es una gran parte de ... y GridView es una pequeña parte de la gran paz. Tiene el mismo problema, y ​​aunque la solución está bien para eliminar, la actualización se vuelve realmente interesante ... El problema real es que parece que, sin una buena razón aparente, falta una muuuuuuuuuuuuuuuuuuuuuuuuuad de la funcionalidad de GridView si el DataSource no es un DataSourceControl : Como llenar las propiedades de claves y valores en los eventos. ¡Disfrutar! ¡Viva Microsoft!

Respondido el 28 de Septiembre de 09 a las 17:09

Realmente no ayudó, pero estoy feliz de que podamos compartir el dolor :) - el berserker

¿Es posible que esté ordenando programáticamente su vista de cuadrícula en su método Page_Load? Si es así, intente mover la ordenación al método Page_Init y vea si eso soluciona el problema.

respondido 01 nov., 09:21

Veo la idea, pero desafortunadamente no - el berserker

Aparentemente, la propiedad GridViewDeleteEventArgs.Keys solo funciona si configura el DataSource de GridView configurando el ID de fuente de datos propiedad - es decir, establecer el Fuente de datos y luego llamar manualmente a DataBind () deja la propiedad Keys (y también la propiedad Values) vacía.

Fuente: http://forums.asp.net/t/1050092.aspx

respondido 29 nov., 11:15

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.