[英]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.