开发者

All GridView rows disappear while selecting a row

Please consider the values in comments which I got in debug mode:

protected void FilesGrid_SelectedIndexChanged(object sender, EventArgs e)
{
    int selected = FilesGrid.SelectedIndex; // selected = 2
    FilesGrid.DataBind();  //added after feedback in comments. it makes no change
    int count = FilesGrid.Rows.Count; // count = 0
    GridViewRow row = FilesGrid.Rows[selected]; // row = null
    GridViewRow row0 = FilesGr开发者_运维百科id.Rows[0]; // row = null
}

I came to this code while investigating why SelectedValue gives null in this event handler (the DataKeyNames parameter was set for sure).

Can anybody explain how it is possible?

Thank you in advance.

PS. Here is my aspx code:

<asp:GridView ID="FilesGrid" runat="server" AutoGenerateColumns="False" 
    AutoGenerateSelectButton="True"  
    onselectedindexchanged="FilesGrid_SelectedIndexChanged" 
    style="margin-top: 0px" >
    <Columns>
        <asp:CommandField ShowDeleteButton="True" />
        <asp:BoundField DataField="Name" HeaderText="Name" />
        <asp:BoundField DataField="Length" DataFormatString="{0:N0}" 
            HeaderText="Size in Bytes" HtmlEncode="False" />
    </Columns>
</asp:GridView>

Here is how I bind data:

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        string [] dd = {"FullName"};
        FilesGrid.DataKeyNames = dd;

        string appPath = Request.PhysicalApplicationPath; 
        DirectoryInfo dirInfo = new DirectoryInfo(appPath); 
        FileInfo[] files = dirInfo.GetFiles();
        FilesGrid.DataSource = files;
        FilesGrid.DataBind();            } 
}


Y copy pasted your code, delete this line FilesGrid.DataBind() in the FilesGrid_SelectedIndexChanged, i see that are 2 methods that you are not posting, that aren't in the code that you posted the onselectedindexchanging, onrowdeleting events, comment them from the aspx and see if it works, or se if that events are not doing something tricking, that are deleting the rows in your GridView.

Tell me if it works

I did this

  protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            string[] dd = { "FullName" };
            FilesGrid.DataKeyNames = dd;

            string appPath = Request.PhysicalApplicationPath;
            DirectoryInfo dirInfo = new DirectoryInfo(appPath);
            FileInfo[] files = dirInfo.GetFiles();
            FilesGrid.DataSource = files;
            FilesGrid.DataBind();
        }
    }
    protected void FilesGrid_SelectedIndexChanged(object sender, EventArgs e)
    {
        int selected = FilesGrid.SelectedIndex; // selected = 2
        //FilesGrid.DataBind();  //added after feedback in comments. it makes no change
        int count = FilesGrid.Rows.Count; // count = 0
        GridViewRow row = FilesGrid.Rows[selected]; // row = null
        GridViewRow row0 = FilesGrid.Rows[0]; // row = null
    }
    protected void FilesGrid_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {

    }
    protected void FilesGrid_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
    {

    }

The aspx code.

<asp:ScriptManager ID="ScriptManager1" runat="server" EnableScriptGlobalization="true"
            AsyncPostBackTimeout="0" EnableScriptLocalization="true">
        </asp:ScriptManager>
        <asp:UpdatePanel ID="upPanel" runat="server">
            <ContentTemplate>        
                <asp:GridView ID="FilesGrid" runat="server" AutoGenerateColumns="False" AutoGenerateSelectButton="True"
                    OnRowDeleting="FilesGrid_RowDeleting" OnSelectedIndexChanged="FilesGrid_SelectedIndexChanged"
                    Style="margin-top: 0px" OnSelectedIndexChanging="FilesGrid_SelectedIndexChanging">
                    <Columns>
                        <asp:CommandField ShowDeleteButton="True" />
                        <asp:BoundField DataField="Name" HeaderText="Name" />
                        <asp:BoundField DataField="Length" DataFormatString="{0:N0}" HeaderText="Size in Bytes"
                            HtmlEncode="False" />
                    </Columns>
                </asp:GridView>
            </ContentTemplate>         
        </asp:UpdatePanel>


remove the FilesGrid.DataBind(); //added after feedback in comments. it makes no change When I add that statement to my code I am getting the error. after removing that please try again. If not working please share the

protected void FilesGrid_SelectedIndexChanging(object sender, GridViewSelectEventArgs e) method code, may be something wrong with that section


The issue was resolved by commenting out the line // if (!Page.IsPostBack). It looks like the data source is lost somehow during the postback. The whole seems to be a local bug with ViewState, because this behavior was not observed by other users. My special thanks to Tim Schmelter and naveen.


You can keep Page.IsPostBack in Page_Load, I was having the same issue and it turns out the grid was not in ViewState in my case. If you use Linq query in your controller you will want to add this property to the grid so it will keep refreshing properly: <asp:Panel EnableViewState="True">

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜