Все строки GridView исчезают при выборе строки - PullRequest
1 голос
/ 01 июля 2011

Обратите внимание на значения в комментариях, которые я получил в режиме отладки:

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
}

Я пришел к этому коду, исследуя, почему SelectedValue дает нулевое значение в этом обработчике событий (параметр DataKeyNames был установлен точно).

Кто-нибудь может объяснить, как это возможно?

Заранее спасибо.

PS. Вот мой код aspx:

<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>

Вот как я связываю данные:

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();            } 
}

Ответы [ 4 ]

0 голосов
/ 10 июня 2018

Вы можете сохранить Page.IsPostBack в Page_Load, у меня возникла та же проблема, и оказалось, что в моем случае сетка не была в ViewState.Если вы используете запрос Linq в своем контроллере, вы захотите добавить это свойство в сетку, чтобы оно продолжало корректно обновляться: <asp:Panel EnableViewState="True">

0 голосов
/ 01 июля 2011

удалить FilesGrid.DataBind(); // добавлено после обратной связи в комментариях.это не меняет меня, когда я добавляю это утверждение в мой код, я получаю сообщение об ошибке.после удаления попробуйте еще раз.Если не работает, поделитесь кодом метода

protected void FilesGrid_SelectedIndexChanging(object sender, GridViewSelectEventArgs e), возможно, что-то не так с этим разделом

0 голосов
/ 06 июля 2011

Проблема была решена путем комментирования строки // if (!Page.IsPostBack). Похоже, что источник данных как-то теряется во время обратной передачи. В целом, похоже, локальная ошибка с ViewState, потому что это поведение не было замечено другими пользователями. Особая благодарность Тиму Шмельтеру и Навину.

0 голосов
/ 01 июля 2011

Y копия вставила ваш код, удалите эту строку FilesGrid.DataBind () в FilesGrid_SelectedIndexChanged, я вижу, что это 2 метода, которые вы не публикуете, которых нет в коде, который вы опубликовали, отобранные в обмене, последующем удалении событий, комментарии их из aspx и посмотрите, работает ли он, или посмотрите, не вызывают ли эти события какие-то хитрости, которые удаляют строки в вашем GridView.

Скажите, работает ли он

Я сделал это

  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)
    {

    }

Код aspx.

<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>
...