簡體   English   中英

我如何獲得在 gridview 中選擇的字段

[英]how do i get the fields selected in the gridview

所以基本上我想創建一個預訂,一個預訂可以有多個訂單,但我不知道如何存儲在其他頁面等中選擇的訂單,但我已經知道我必須做一個循環來運行 gridview bue i不知道如何使用尋呼機和搜索文本框來做到這一點。

這是它的樣子: 在此處輸入圖像描述

當前CS

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Configuration;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Gestão_de_embarques
{
    public partial class CriarEcomenda : System.Web.UI.Page
    {
        SqlConnection con = new SqlConnection(WebConfigurationManager.ConnectionStrings["constring"].ConnectionString);
        protected void Page_Load(object sender, EventArgs e)
        {
            con.Open();
            string user = Convert.ToString(Session["user"]);

            username.Text = user;

            if (Session["user"] == null || Session["login"] == null)
            {
                Response.Redirect("Login.aspx", false);
            }

            if (!Page.IsPostBack)
            {
                refreshdata();
            }
            con.Close();
        }

        public void refreshdata()
        {
            SqlCommand cmd = new SqlCommand("select DISTINCT No_ from [Encomenda]", con);
            SqlDataAdapter sda = new SqlDataAdapter(cmd);
            DataTable dt = new DataTable();
            sda.Fill(dt);
            GridView1.DataSource = dt;
            GridView1.DataBind();
        }

        protected void btnsearch_Click(object sender, EventArgs e)
        {
            con.Open();

            if (txtSearch.Value == "")
            {
                refreshdata();
            }
            else
            {
                try
                {
                    SqlCommand cmd = new SqlCommand("select DISTINCT No_ from [encomenda] where No_= @No_", con);
                    cmd.Parameters.Add("@No_", SqlDbType.NVarChar).Value = txtSearch.Value;

                    SqlDataReader sdr = cmd.ExecuteReader();

                    if (sdr.Read())
                    {
                        sdr.Close();
                        SqlDataAdapter sda = new SqlDataAdapter(cmd);

                        DataTable dt = new DataTable();
                        sda.Fill(dt);
                        GridView1.DataSource = dt;
                        GridView1.DataBind();

                        con.Close();
                    }
                    else
                    {
                        SqlDataAdapter sda = new SqlDataAdapter(cmd);
                        sdr.Close();
                        DataTable dt = new DataTable();
                        sda.Fill(dt);
                        GridView1.DataSource = dt;
                        GridView1.DataBind();
                        ButtonCreate.Visible = false;
                        
                    }
                }

                    
                catch(Exception ex)
                {

                }
            }
        }

        protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            GridView1.PageIndex = e.NewPageIndex;
            refreshdata();
        }
    }
}

好吧,如果你不是數據分頁,那么未綁定的復選框將持續存在,甚至回發。

但是,既然你有數據分頁? 然后從數據庫中保存選定的 PK id。 (您不必顯示 pk 行,而只需設置 DataKeys = "ID" 或者您的 PK 行來自數據庫。

如前所述,對於搜索和分頁,您必須重新綁定網格,因此您不能使用網格來持久化選中的復選框。 假設我們有一個酒店列表到 select。

我們的標記是這樣的:

   <div style="width:40%">
      <asp:GridView ID="MyGrid" runat="server" CssClass="table table-hover" 
          DataKeyNames="ID" AutoGenerateColumns="false" OnRowDataBound="MyGrid_RowDataBound" >

        <Columns>
           <asp:BoundField DataField="FirstName" HeaderText="FirstName"  />
           <asp:BoundField DataField="LastName" HeaderText="Last Name" />
           <asp:BoundField DataField="HotelName" HeaderText="Hotel Name" />
           <asp:BoundField DataField="HotelName" HeaderText="Hotel Name" />
           <asp:BoundField DataField="Province" HeaderText="Province" />

            <asp:TemplateField HeaderText="Select">
                <ItemTemplate>
                    <asp:CheckBox ID="CheckBox1" runat="server" OnCheckedChanged="CheckBox1_CheckedChanged" />
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
      </asp:GridView>

        <asp:Button ID="Button1" runat="server" Text="Show Selected rows" OnClick="Button1_Click" />
        <br />
        <br />

    </div>

加載這個網格的代碼是:

    List<int> MySelected = new List<int>();

    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack == false)
        {
            LoadGrid();
            ViewState["MySelected"] = MySelected;
        }
        else
        {
            MySelected = (List<int>)ViewState["MySelected"];
        }
    }

    public void LoadGrid()
    {
        using (SqlCommand cmdSQL = new SqlCommand("SELECT * from tblHotels ORDER BY HotelName",
            new SqlConnection(Properties.Settings.Default.TEST3)))
        {

            cmdSQL.Connection.Open();
            DataTable rst = new DataTable();
            rst.Load(cmdSQL.ExecuteReader());
            MyGrid.DataSource = rst;
            MyGrid.DataBind();
        }
    }

    protected void MyGrid_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            int PkRow = (int)((DataRowView)e.Row.DataItem)["ID"];
            CheckBox ckbox = (CheckBox)e.Row.FindControl("CheckBox1");
            if (MySelected.Contains(PkRow)) {
                ckbox.Checked = true;
            }
        }
    }

    protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
    {
        CheckBox ckBox = (CheckBox)sender;
        GridViewRow gvRow = (GridViewRow)ckBox.Parent.Parent;

        int RowPK = (int)(MyGrid.DataKeys[gvRow.RowIndex]["ID"]);
        if (ckBox.Checked)
            MySelected.Add(RowPK);
        else
            MySelected.Remove(RowPK);
    }

現在我是如何創建一個簡單列表的。 當您選中一個框時,您只需將 GridRow“PK”中的 PK 行添加到列表中。

因此,從數據庫中獲取/處理“列表”的代碼如下所示:

    protected void Button1_Click(object sender, EventArgs e)
    {
        string MyPkList = string.Join(",", MySelected);
        string strSQL = "SELECT * from tblHotels where ID IN(" + MyPkList + ")";

        using (SqlCommand cmdSQL = new SqlCommand(strSQL, new SqlConnection(Properties.Settings.Default.TEST3)))
        {
            cmdSQL.Connection.Open();
            DataTable rstPickList = new DataTable();
            rstPickList.Load(cmdSQL.ExecuteReader());

            foreach (DataRow OneRow in rstPickList.Rows)
            {
                Response.Write("<h2> PK = " + OneRow["Id"].ToString() + " Hotel Name = " + OneRow["HotelName"] + "</h2>");

            }
        }
    }

所以,如果我檢查說 3 行,然后點擊那個按鈕,你會得到這個:

在此處輸入圖像描述

這確實意味着您必須將復選框設置為自動回發。 因此,這意味着對於復選框的單擊,您將進行回發。 但是,如果您只需要回發該網格選擇部分而不是整個頁面,則可以將整個網格放在更新面板中。

從數據庫中獲得 PK 值列表后,如按鈕所示,我們必須針對數據庫表進行處理,並且由於分頁,我們無法使用網格。 如前所述,如果 gridview 可以放在一頁上,那么您將不需要持久化代碼,並且您可以循環網格視圖以獲取選中的行 - 您不需要任何代碼來持久化這些值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM