Как выделить строки в виде таблицы без использования asp:BoundFields

#c# #asp.net #select #gridview #datatables

#c# #asp.net #выберите #gridview #таблицы данных

Вопрос:

В моем ASP.Net app, у меня есть «Представление сетки», заполняемое из моей таблицы SQL Server с использованием хранимой процедуры, которая выбирает данные из таблицы на основе сохраненного имени пользователя. Сначала я управляю хранимыми процедурами и данными в отдельном файле C # под названием «DataAccessManager.cs»:

 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) чтобы вернуть datatable ticketDT для заполнения моего Gridview с именем ‘uxTicketGridView’ при загрузке страницы.

 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 кнопки выбора:

  <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>
  

Теперь мой вопрос таков: «Как мне добавить функциональность для выбора строк в моем gridview без использования asp:BoundFields ? Возможно ли это? Я уже могу выбирать строки при нажатии кнопок, но что мне нужно, так это затем извлечь часть информации из этой строки (скажем, значение из столбца ‘Номер билета’) для использования в другой хранимой процедуре, подобной этой string ticketNumber = uxRowSelected.SelectedValue("Ticket Number"); или чему-то подобному. Когда я попытался добавить <asp:BoundField DataField="TicketNumber" HeaderText="Ticket Number" /> и т.д. … Столбец за столбцом, я закончил с удвоением всего. Есть предложения?

Ответ №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();
}
  

Комментарии:

1. Хорошо, извините, что потребовалось так много времени, чтобы убедиться, что это сработало, но это действительно работает. DataKeyNames получилось. На самом деле я смог добавить AutoGenerateColumns=false в gridview, а затем смог использовать <asp:BoundField.../> без получения двойных значений. Еще раз спасибо!