我如何获取在gridview中选择的字段

Posted

技术标签:

【中文标题】我如何获取在gridview中选择的字段【英文标题】:how do i get the fields selected in the gridview 【发布时间】:2021-09-02 08:27:53 【问题描述】:

所以基本上我想创建一个预订,一个预订可以有多个订单,但我不知道如何存储已在其他页面等中选择的订单,但我已经知道我必须执行一个循环来运行gridview bue 我不知道如何使用寻呼机和搜索文本框来做到这一点。

这是它的外观:

当前的 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();
        
    

【问题讨论】:

循环遍历 GridView 中的所有 GridViewRows。在每一行中,使用 FindControl() 并强制转换为对象(复选框或文本框),然后根据您找到的对象获取 CheckedText 属性。 你能给我举个例子吗? 【参考方案1】:

好吧,如果您不进行数据分页,那么未绑定复选框将持续存在并且即使在回发时仍然存在。

但是,既然你有数据分页?然后你从数据库中持久化选定的 PK id。 (您不必显示 pk 行,只需设置 DataKeys = "ID" 或您的 PK 行来自数据库。

如前所述,通过搜索和分页,您必须重新绑定网格,因此您不能使用网格来保留选定的复选框。假设我们有一个可供选择的酒店列表。

我们的标记是这样的:

   <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 可以放在一页上,那么您将不需要持久化代码,并且您可以循环网格视图以获取选中的行 - 您不需要任何代码来持久化这些值。

【讨论】:

但如果我不使用寻呼机,gridview 会很大,而且我的桌子也没有 PK 字段 我可以只使用我的订单号进行相同的验证吗? 是的 - 将 PK 保存在该列表中,您保存该数字,然后将其用于复选框或不常规。所以代替 PK,你有那个网格行 - 如果该列是一个数据字段,那么你使用单元格来获取值。如果它是模板化字段,则使用查找控件。因此,代替该列表中的 PK,存储订单号。例程将与实际上几乎相同,如果您进行更改,则不需要更改代码。我现在从 DataKhey 中拔出。如果您愿意,可以简单地设置 DataKeys = "ordernum" 或其他任何东西。 (所以用你的列替换 ID) 我为我的列替换了 ID,但现在 cs 代码设置为 int 值而不是 nvarchar,我无法解决该问题 但是您将保存这些值的“列表”或集合从 int 更改为 string,对吗?您不必使用 DataKeys - 对于您在网格中没有或没有显示的列,它们往往“更”方便。但可以肯定的是,将 MySelected 从“int”更改为字符串,应该没问题。而且您不必在这里使用数据键。在所有这些代码中,我打赌你的大部分代码你会经常从所有这些事件中的一个网格行中提取/使用/抓取数据。我的意思是,看起来非常接近 - 我拉出复选框值的方式也与您可以从该行中提取其他值的方式相同

以上是关于我如何获取在gridview中选择的字段的主要内容,如果未能解决你的问题,请参考以下文章

如何在gridview上获取隐藏字段的值?

如何取得gridview中选中行中的某一字段

获取gridview中选中记录的超链接字段值

如何从QML中的GridView或ListView获取实例化的委托组件

怎么获取DataTable中某一字段的值

请问如何获得GridView选中行的每一列的信息?