【问题标题】:How to select rows in a Grid View without using asp:BoundFields如何在不使用 asp:BoundFields 的情况下选择网格视图中的行
【发布时间】:2019-07-27 10:24:43
【问题描述】:

在我的 ASP.Net 应用程序中,我使用存储过程从我的 SQL Server 表中填充了一个“网格视图”,该存储过程根据存储的用户名从表中选择数据。我首先在一个名为“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) 以返回数据表 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 使用 CommandField 选择按钮添加到 DOM:

 <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 中的行?那可能吗?当我单击按钮时,我已经可以选择行,但是我需要从该行中提取一条信息(例如“票号”列中的值)以在另一个存储过程中使用,例如 @987654330 @ 或类似的东西。当我尝试逐列添加 &lt;asp:BoundField DataField="TicketNumber" HeaderText="Ticket Number" /&gt; 等...时,我最终得到了所有内容的双倍。有什么建议吗?

【问题讨论】:

    标签: c# asp.net select gridview datatables


    【解决方案1】:

    我不确定这是否是您需要的。但您始终可以使用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();
    }
    

    【讨论】:

    • 好的,抱歉花了这么长时间来验证它是否有效,但它确实有效。 DataKeyNames 成功了。我实际上能够将AutoGenerateColumns=false 添加到gridview,然后可以使用&lt;asp:BoundField.../&gt; 而不会获得双打。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 2021-05-29
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多