-2

グリッドビュー内に 2 つのドロップダウン リストがあります。

  1. 1 番目のドロップダウン - の選択用Page No

  2. 2 番目のドロップダウン - の選択用Page Size

ドロップダウンリストに関連する問題は次のとおりです:-

選択するchangeと正常に動作し、正確な結果が表示されます。しかし、選択を最後の値に戻すと、再びgridview壊れます。すべてのコードを試してデバッグしましたが、正確な解決策を見つけることができませんでした。

dropdownlist内部の aspx コードを参照してくださいGridview:-

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Always">
            <ContentTemplate>
                <asp:GridView ID="grdUser"
                    OnPageIndexChanging="grdUser_PageIndexChanging"
                    AutoGenerateColumns="false" EnableViewState="true"
                    AllowPaging="true"
                    OnDataBound="grdUser_DataBound"
                    runat="server"
                    Width="100%"
                    border="1"
                    DataKeyNames="Id"
                    PageSize="2">

                    <Columns>
                        <asp:TemplateField HeaderText="Select" ItemStyle-Width="30" HeaderStyle-CssClass="k-grid td">
                            <ItemTemplate>
                                <asp:CheckBox ID="chkDelete" runat="server" />
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:BoundField DataField="username" HeaderText="UserName" ItemStyle-Width="30" HeaderStyle-CssClass="k-grid td" />
                        <asp:BoundField DataField="email" HeaderText="Email Id" ItemStyle-Width="30" HeaderStyle-CssClass="k-grid td" />
                        <asp:BoundField DataField="usertype" HeaderText="UserType" ItemStyle-Width="30" HeaderStyle-CssClass="k-grid td" />
                        <asp:BoundField DataField="active" HeaderText="Active" ItemStyle-Width="30" HeaderStyle-CssClass="k-grid td" />
                        <asp:TemplateField HeaderText="Action" HeaderStyle-Width="15%" ItemStyle-Width="30" HeaderStyle-CssClass="k-grid td">
                            <ItemTemplate>
                                <asp:ImageButton ID="btnDelete" AlternateText="Delete" ImageUrl="~/images/delete.png" runat="server" Width="15" Height="15" CommandName="Delete" CommandArgument='<%# Eval("Id") %>' CausesValidation="false" OnClientClick="return confirm('Are you sure you want to delete this record?')" />
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:CommandField ButtonType="Image" ItemStyle-Width="15" EditImageUrl="~/images/edit.png" ShowEditButton="True" ControlStyle-Width="15" ControlStyle-Height="15" CancelImageUrl="~/images/close.png" UpdateImageUrl="~/images/update.png">
                            <ControlStyle Height="20px" Width="20px"></ControlStyle>
                        </asp:CommandField>
                    </Columns>

                    <PagerStyle ForeColor="Blue"
                        BackColor="LightBlue" />
                    <PagerTemplate>
                        <table style="width: 100%">
                            <tr>
                                <td class="col-md-7">
                                    <asp:Label ID="MessageLabel"
                                        ForeColor="Blue"
                                        Text="Select a page:"
                                        runat="server" />
                                    <asp:LinkButton ID="FirstLB" runat="server" CommandName="Page" CommandArgument="First" ToolTip="First"><<</asp:LinkButton>

                                    <asp:LinkButton ID="PrevLB" runat="server" CommandName="Page" CommandArgument="Prev" ToolTip="Previous"><</asp:LinkButton>
                                    <asp:DropDownList ID="PageDropDownList"
                                        AutoPostBack="true"
                                        OnSelectedIndexChanged="PageDropDownList_SelectedIndexChanged"
                                        runat="server" />
                                    <asp:LinkButton ID="NextLB" runat="server" CommandName="Page" CommandArgument="Next" ToolTip="Next">></asp:LinkButton>

                                    <asp:LinkButton ID="LastLB" runat="server" CommandName="Page" CommandArgument="Last" ToolTip="Last">>></asp:LinkButton>
                                </td>
                                <td class="col-md-3">
                                    <asp:Label ID="PageSizeLabel" runat="server" Text="Select Page Size: "></asp:Label>
                                    <asp:DropDownList ID="ddlPageSize" runat="server" OnSelectedIndexChanged="ddlPageSize_SelectedIndexChanged" AutoPostBack="true">
                                        <asp:ListItem Value="2" Text="2" />
                                        <asp:ListItem Value="5" Text="5" />
                                        <asp:ListItem Value="10" Text="10" />
                                    </asp:DropDownList>
                                </td>
                                <td class="col-md-2">
                                    <asp:Label ID="CurrentPageLabel"
                                        ForeColor="Blue"
                                        runat="server" />
                                </td>
                            </tr>
                        </table>
                    </PagerTemplate>
                </asp:GridView>
            </ContentTemplate>
        </asp:UpdatePanel>

注: Gridview は の下にありUpdatePanelます。

また、各イベントのコード ビハインドとBindGrid();

protected void BindGrid()
    {
        string conString = ConfigurationManager.ConnectionStrings["DefaultCSRConnection"].ConnectionString;
        SqlCommand cmd = new SqlCommand("select Id,username,email,usertype,active from tbl_User ORDER By Id DESC");
        using (SqlConnection con = new SqlConnection(conString))
        {
            using (SqlDataAdapter sda = new SqlDataAdapter())
            {
                cmd.Connection = con;
                sda.SelectCommand = cmd;
                using (DataTable dt = new DataTable())
                {
                    sda.Fill(dt);
                    grdUser.DataSource = dt;
                    grdUser.DataBind();
                    DisablePageDirections();
                    // System.Threading.Thread.Sleep(3000);
                    //return dt;
                }
            }
        }
    }
    private void DisablePageDirections()
    {
        if (grdUser.PageIndex == 0)
        {
            (grdUser.BottomPagerRow.FindControl("FirstLB") as LinkButton).Enabled = false;
            (grdUser.BottomPagerRow.FindControl("PrevLB") as LinkButton).Enabled = false;
        }
        if (grdUser.PageIndex == grdUser.PageCount - 1)
        {
            (grdUser.BottomPagerRow.FindControl("NextLB") as LinkButton).Enabled = false;
            (grdUser.BottomPagerRow.FindControl("LastLB") as LinkButton).Enabled = false;
        }
    }
    protected void ddlPageSize_SelectedIndexChanged(Object sender, EventArgs e)
    {
        GridViewRow pagerRow = grdUser.BottomPagerRow;
        DropDownList pageSizeList = (DropDownList)pagerRow.Cells[0].FindControl("ddlPageSize");
        grdUser.PageSize = Convert.ToInt32(pageSizeList.SelectedValue);
        Context.Session["PageSize"] = pageSizeList.SelectedValue;
        BindGrid();
    }
    protected void PageDropDownList_SelectedIndexChanged(object sender, EventArgs e)
    {
        GridViewRow pagerRow = grdUser.BottomPagerRow;
        DropDownList pageList = (DropDownList)pagerRow.Cells[0].FindControl("PageDropDownList");
        grdUser.PageIndex = pageList.SelectedIndex;
        BindGrid();
    }

gridview データバインド イベントも参照してください:-

protected void grdUser_DataBound(object sender, EventArgs e)
    {
        GridViewRow pagerRow = grdUser.BottomPagerRow;
        DropDownList pageSizeList = (DropDownList)pagerRow.Cells[0].FindControl("ddlPageSize");
        if (Context.Session["PageSize"] != null)
        {
            pageSizeList.SelectedValue = Context.Session["PageSize"].ToString();
        }
        // Retrieve the DropDownList and Label controls from the row.
        DropDownList pageList = (DropDownList)pagerRow.Cells[0].FindControl("PageDropDownList");
        Label pageLabel = (Label)pagerRow.Cells[0].FindControl("CurrentPageLabel");
        if (pageList != null)
        {
            for (int i = 0; i < grdUser.PageCount; i++)
            {
                int pageNumber = i + 1;
                ListItem item = new ListItem(pageNumber.ToString());
                if (i == grdUser.PageIndex)
                {
                    item.Selected = true;
                }
                pageList.Items.Add(item);
            }
        }
        if (pageLabel != null)
        {
            int currentPage = grdUser.PageIndex + 1;
            pageLabel.Text = "Page " + currentPage.ToString() + " of " + grdUser.PageCount.ToString();
        }
    }

また、動作に問題はなく、ddlPageSize正常に動作しています

4

2 に答える 2

0

以前の回答では、マイクロソフトとの技術的な課題に対処しようとしましたGridView

ただし、商用アプリケーションの場合は、GridViewTelerik、DevExpress、Infragistics、ComponentOne などのベンダーのサード パーツを使用することをお勧めします。

GridViewsこれらのベンダーが提供するほとんどの製品には、ページング、ページ サイズのカスタマイズなどの単純な機能が組み込まれているためです。

この回答に基づいて、実行時のページサイズのカスタマイズや同様のものについて心配するコード行を書く必要はありません

このデモをチェック

于 2014-12-23T17:55:24.743 に答える
0

問題は下の部分

protected void grdUser_DataBound(object sender, EventArgs e)
    {
        //...
            for (int i = 0; i < grdUser.PageCount; i++)
            {
                int pageNumber = i + 1;
                ListItem item = new ListItem(pageNumber.ToString());
                if (i == grdUser.PageIndex)
                {
                    item.Selected = true;
                }
                pageList.Items.Add(item);
            }
        //...
    }

PageDropDownList現在のグリッドを反映しPageCountて現在のページを選択しようとすると

グリッドを壊さずにそのドロップダウンをプポレートするより良い方法を考えるかもしれません

しかし、私の推奨は、ではなくTextBoxforを使用することですCurrentPageDropDownList

なんで?

グリッドに数千のページがあり、ユーザーがページ番号 5555 を望んでいると仮定します。このアプローチでは、ユーザーがDropDownList1 から 5555 までスクロールする必要があります。これは、ユーザーが目的のページに到達するまでページをナビゲートし続けたかのようになります。 .

WhileTextBoxでは、エンド ユーザーは番号を入力するだけでページを選択できます。

そして、それを入力する手間からあなたを救いDropDownList、うまくいけばあなたの問題を解決します

アップデート:

を使用するTextBoxと、コードは次のようになります(ただし、テストするための完全なソリューションは作成していません)。

Aspx で、PageDropDownList次のようにコントロールをテキスト ボックスに置き換えます。

<asp:TextBox ID="txtPageNumber" AutoPostBack="true" OnTextChanged="txtPageNumber_TextChanged" runat="server" />

PageDropDownList_SelectedIndexChangedコードビハインドで、イベントハンドラーを次のものに置き換えます

protected void txtPageNumber_TextChanged(object sender, EventArgs e)
    {
        GridViewRow pagerRow = grdUser.BottomPagerRow;
        TextBox txtPageNumber = (TextBox)sender;
        //Note you need to do more validation on the entered value 
        //Do not allow strings, floats, etc
        int currentPage = int.Parse(txtPageNumber.Text);
        //To handle entries larger than page count        
        if(currentPage >= grdUser.PageCount)
        {
         grdUser.PageIndex = grdUser.PageCount - 1;
         txtPageNumber.Text = grdUser.PageIndex.ToString();             
        }
        else 
          grdUser.PageIndex  = currentPage;

        BindGrid();
    }

そして最後に次のように更新grdUser_DataBoundします

protected void grdUser_DataBound(object sender, EventArgs e)
    {
        //...... your original code here
        //DropDownList pageList = (DropDownList)pagerRow.Cells[0].FindControl("PageDropDownList");
        TextBox txtPageNumber = (TextBox)pagerRow.Cells[0].FindControl("txtPageNumber");
        txtPageNumber.Text = grdUser.PageIndex.ToString();
        //Label pageLabel = (Label)pagerRow.Cells[0].FindControl("CurrentPageLabel");
        // if (pageList != null)
        // {
            // for (int i = 0; i < grdUser.PageCount; i++)
            // {
                // int pageNumber = i + 1;
                // ListItem item = new ListItem(pageNumber.ToString());
                // if (i == grdUser.PageIndex)
                // {
                    // item.Selected = true;
                // }
                // pageList.Items.Add(item);
            // }
        // }
        //...... your original code here
    }
于 2014-12-23T12:49:36.160 に答える