如何在不使用 asp:BoundFields 的情况下在网格视图中显示 select 行
How to select rows in a Grid View without using asp:BoundFields
在我的 ASP.Net 应用程序中,我有一个从我的 SQL 服务器 table 填充的“网格视图”,使用一个存储过程 selects 来自table 基于存储的用户名。我首先在名为 'DataAccessManager.cs':
的单独 C# 文件中管理存储过程和数据
public class DataAccessManager
{
private string _connString;
private Dictionary<string, string> _questions;
private Dictionary<string, string> _answers;
public DataAccessManager()
{
_connString = ConfigurationManager.ConnectionStrings["DevConnectionString"].ToString();
_questions = new Dictionary<string, string>();
_answers = new Dictionary<string, string>();
}
//
public DataTable GetTicketByOwnership(string UserName)
{
DataTable ticketDT = null;
SqlConnection conn = null;
try
{
conn = new SqlConnection(_connString);
conn.Open();
SqlCommand cmd = new SqlCommand("dbo.a_GetTicketByOwnership", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@UserName", SqlDbType.VarChar).Value = UserName;
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adapter.Fill(ds);
ticketDT = ds.Tables[0];
}
finally
{
if (conn != null)
{
conn.Close();
}
}
return ticketDT;
}
....
}
然后我调用 GetTicketByOwnership(string UserName)
到 return 数据 table ticketDT
以在页面加载时填充名为 'uxTicketGridView' 的 Gridview。
public partial class Summary : Page
{
DataAccessManager _dtMgr;
protected int _widestDataLength;
DataTable _mainDT;
protected void Page_Load(object sender, EventArgs e)
{
_widestDataLength = 0;
_dtMgr = new DataAccessManager();
Session["UserNameSession"] = "jbrown";
Session["isUserAuthenticated"] = true;
string staffName = _dtMgr.GetStaffNameByUser(Session["UserNameSession"].ToString());
if (staffName == string.Empty)
{
//error
}
else
{
Session["StaffName"] = staffName;
uxStaffNameTextbox.Text = "Hello " + staffName;
_mainDT = _dtMgr.GetTicketByOwnership(Session["UserNameSession"].ToString());
....
if (!Page.IsPostBack)
{
uxTktGridView.DataSource = _mainDT;
uxTktGridView.DataBind();
....
返回 HTML,asp:GridView
被添加到 DOM 并带有 CommandField
select 按钮:
<asp:GridView ID="uxTktGridView" runat="server" CssClass="GridView" BorderStyle="Solid" onRowDataBound="uxTktGridView_RowDataBound" OnSorting="uxTktGridView_Sorting" BackColor="White" BorderColor="#D6D2D2" BorderWidth="1px" CellPadding="3" SelectedIndex="-1" AllowSorting="True" Font-Size="Small" Width="100%" Visible="True" EnableModelValidation="True" style=" margin-top: 10px; margin-bottom: 10px;">
<Columns>
<asp:CommandField ShowSelectButton="True" SelectText="Details" ButtonType="Button" HeaderText="Select" />
</Columns>
....
</asp:GridView>
我现在的问题是'如何在不使用 asp:BoundFields
的情况下将功能添加到 gridview
中的 select 行?那可能吗?当我点击按钮时,我已经可以 select 行,但我需要的是从该行中提取一条信息(比如 'Ticket Number' 列中的值)以用于另一个存储这样的过程 string ticketNumber = uxRowSelected.SelectedValue("Ticket Number");
或类似的东西。当我尝试逐列添加 <asp:BoundField DataField="TicketNumber" HeaderText="Ticket Number" />
等时,我最终得到了所有内容的双倍。有什么建议吗?
我不确定这是否是您需要的。但您始终可以使用 DataKeyNames
。您在 GridView
中定义它们
<asp:GridView ID="GridView1" runat="server" DataKeyNames="id, name">
然后您始终可以使用正确的行号和 DataKey 访问这些值。
protected void Button1_Click(object sender, EventArgs e)
{
int id = Convert.ToInt32(GridView1.DataKeys[i].Values[0]);
string name = GridView1.DataKeys[i].Values[1].ToString();
}
在我的 ASP.Net 应用程序中,我有一个从我的 SQL 服务器 table 填充的“网格视图”,使用一个存储过程 selects 来自table 基于存储的用户名。我首先在名为 'DataAccessManager.cs':
的单独 C# 文件中管理存储过程和数据public class DataAccessManager
{
private string _connString;
private Dictionary<string, string> _questions;
private Dictionary<string, string> _answers;
public DataAccessManager()
{
_connString = ConfigurationManager.ConnectionStrings["DevConnectionString"].ToString();
_questions = new Dictionary<string, string>();
_answers = new Dictionary<string, string>();
}
//
public DataTable GetTicketByOwnership(string UserName)
{
DataTable ticketDT = null;
SqlConnection conn = null;
try
{
conn = new SqlConnection(_connString);
conn.Open();
SqlCommand cmd = new SqlCommand("dbo.a_GetTicketByOwnership", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@UserName", SqlDbType.VarChar).Value = UserName;
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adapter.Fill(ds);
ticketDT = ds.Tables[0];
}
finally
{
if (conn != null)
{
conn.Close();
}
}
return ticketDT;
}
....
}
然后我调用 GetTicketByOwnership(string UserName)
到 return 数据 table ticketDT
以在页面加载时填充名为 'uxTicketGridView' 的 Gridview。
public partial class Summary : Page
{
DataAccessManager _dtMgr;
protected int _widestDataLength;
DataTable _mainDT;
protected void Page_Load(object sender, EventArgs e)
{
_widestDataLength = 0;
_dtMgr = new DataAccessManager();
Session["UserNameSession"] = "jbrown";
Session["isUserAuthenticated"] = true;
string staffName = _dtMgr.GetStaffNameByUser(Session["UserNameSession"].ToString());
if (staffName == string.Empty)
{
//error
}
else
{
Session["StaffName"] = staffName;
uxStaffNameTextbox.Text = "Hello " + staffName;
_mainDT = _dtMgr.GetTicketByOwnership(Session["UserNameSession"].ToString());
....
if (!Page.IsPostBack)
{
uxTktGridView.DataSource = _mainDT;
uxTktGridView.DataBind();
....
返回 HTML,asp:GridView
被添加到 DOM 并带有 CommandField
select 按钮:
<asp:GridView ID="uxTktGridView" runat="server" CssClass="GridView" BorderStyle="Solid" onRowDataBound="uxTktGridView_RowDataBound" OnSorting="uxTktGridView_Sorting" BackColor="White" BorderColor="#D6D2D2" BorderWidth="1px" CellPadding="3" SelectedIndex="-1" AllowSorting="True" Font-Size="Small" Width="100%" Visible="True" EnableModelValidation="True" style=" margin-top: 10px; margin-bottom: 10px;">
<Columns>
<asp:CommandField ShowSelectButton="True" SelectText="Details" ButtonType="Button" HeaderText="Select" />
</Columns>
....
</asp:GridView>
我现在的问题是'如何在不使用 asp:BoundFields
的情况下将功能添加到 gridview
中的 select 行?那可能吗?当我点击按钮时,我已经可以 select 行,但我需要的是从该行中提取一条信息(比如 'Ticket Number' 列中的值)以用于另一个存储这样的过程 string ticketNumber = uxRowSelected.SelectedValue("Ticket Number");
或类似的东西。当我尝试逐列添加 <asp:BoundField DataField="TicketNumber" HeaderText="Ticket Number" />
等时,我最终得到了所有内容的双倍。有什么建议吗?
我不确定这是否是您需要的。但您始终可以使用 DataKeyNames
。您在 GridView
<asp:GridView ID="GridView1" runat="server" DataKeyNames="id, name">
然后您始终可以使用正确的行号和 DataKey 访问这些值。
protected void Button1_Click(object sender, EventArgs e)
{
int id = Convert.ToInt32(GridView1.DataKeys[i].Values[0]);
string name = GridView1.DataKeys[i].Values[1].ToString();
}