【问题标题】:How to add a dropdownlist that's dynamically populated from database to each row in datatable gridview如何将从数据库动态填充的下拉列表添加到数据表gridview中的每一行
【发布时间】:2020-03-19 18:55:00
【问题描述】:

因此,我创建了一个功能齐全的网格视图,其中最后两列作为下拉列表,从数据库中填充并从中读取/写入。但是我需要对 gridview 实现搜索,所以我使用了 Datatables.net 插件,它工作得很好,但是只要我添加下拉列表,搜索就会被禁用。除非我通过 javascript 添加它们,而且我在该领域的经验不足以自己完成。

在我切换到数据表插件之前,我曾经只是在gridview的Rowdatabound事件中附加我需要的下拉列表,我怎样才能通过javascript实现类似的东西?

这是java脚本代码:

var TableContent = "<tr>";

if (!$("#req").length) 
    $("body").append("<table id='req'></table>");
else 
    $('#req').prepend($('<thead>').append($('.add_ADU')));


var colns = [

{ "data": "Request_ID", title: "ID", },
{ "data": "Student_ID", visible:true },
{ "data": "Type", visible:true },
{ "data": "Description", visible:true },
{ "data": "Language", visible:true },
{ "data": "PUC", visible:true },
{ "data": "Quantity", title: "Quantity" },
{ "data": "Comments", title: "Comments" },
{ "data": "Fees", title: "Fees" },
{ "data": "Date", title: "Date" },
{ "data": "Payment_Status", title: "Payment Status" },
{ "data": "Payment_Date", title: "Payment Date" },
{ "data": "Student_Name", title: "Student Name", visible:true },
{ "data": "Payment_ID",title:"Payment ID", title: "Phone" },
{ "data": "Addressed_To",title: "Addressed To", visible:true },
{ "data": "username", title:"Assigned To",visible:true },
{ "data": "status", title:"Status",visible:true }

];

var table = $('#req').DataTable({
    select: true,

    "columns": colns,
    "order": [[ 12, "desc" ]],
    "initComplete": function (settings, json) {
        reset_table_page_length($(window).height());
    },

});


$("#req tr").append(
    '<select id="assign"' +
    '<option value="Paid">him</option>' +
    '<option value="NotPaid">her</option>' +
    '</select>'
)


$("#req_filter").prepend(
    '<select id="inp-sel-status-fltr" class="table-toolbar-inp">' +
        '<option value="Paid">Paid</option>' +
    '<option value="NotPaid">Not Paid</option>'+ 
    '</select>'
    )


$("#inp-sel-status-fltr").change(function myfunction() {
    filter_table_by_status($(this).val());
});




function filter_table_by_status(val) {
    table.column(10).search(val);
    table.draw();
}

尽管很可悲,但这就是我实现我想要达到的目标的程度:

$("#req tr").append(
'<select id="assign"' +
'<option value="Paid">him</option>' +
'<option value="NotPaid">her</option>' +
'</select>')

这是 gridview 的 HTML 代码:

   <div class="container">
            <asp:GridView BorderWidth="0" CssClass="stripe compact order-column row-border" runat="server" AutoGenerateColumns="true" ID="req" OnRowDataBound="req_RowDataBound" ClientIDMode="Static" Style="width: 100% !important">
                <HeaderStyle CssClass="add_ADU" /> 
            </asp:GridView>

在后面的代码中,我只需附加下拉列表,然后查询我需要的数据并使用以下代码填充它们:

protected void req_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            DataTable table = new DataTable();
            var openCloseddl = e.Row.FindControl("openCloseddl") as DropDownList;
            var assignddl = e.Row.FindControl("assignToddl") as DropDownList;
            assignddl.DataMember = "username";
            assignddl.DataValueField = "username";
            assignddl.DataSource = table;


            //get the values of the conditions that define which staff 
            var request_id = e.Row.Cells[0].Text;
            var type = e.Row.Cells[3].Text;
            var description = e.Row.Cells[4].Text;
            var puc = e.Row.Cells[6].Text;
            var quantity = e.Row.Cells[7].Text;



            //fetch which staff member it's assigned to if exists.
            SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["studentOrderUpload"].ConnectionString);

            SqlCommand comm = new SqlCommand("SELECT username from request_status WHERE request_id = @request_id and type = @type and description = @description and puc = @puc and quantity = @quantity", conn);
            comm.Parameters.AddWithValue("@request_id", request_id);
            comm.Parameters.AddWithValue("@type", type);
            comm.Parameters.AddWithValue("@description", description);
            comm.Parameters.AddWithValue("@puc", puc);
            comm.Parameters.AddWithValue("@quantity", quantity);

            try
            {
                conn.Open();
                object result = comm.ExecuteScalar();

                string resultText = (result == null ? "" : result.ToString());
                conn.Close();

                //if it's not assigned to anyone, show every staff member.
                if (resultText == "")
                {
                    if (type.ToLower().Contains("customized"))
                    {
                        SqlCommand cmd1 = new SqlCommand("select username from staff where type = 'customized'", conn);
                        conn.Open();
                        SqlDataAdapter ad1 = new SqlDataAdapter(cmd1);
                        ad1.Fill(table);
                        conn.Close();
                        assignddl.DataBind();
                        assignddl.SelectedValue = "Scholarship";
                        if (openCloseddl.SelectedValue == "Open")
                        {
                            openCloseddl.Enabled = true;
                        }
                        assignddl.Items.RemoveAt(1);
                    }
                    else
                    {
                        SqlCommand cmd1 = new SqlCommand("select username from staff where type ='standard'", conn);
                        conn.Open();
                        SqlDataAdapter ad1 = new SqlDataAdapter(cmd1);
                        ad1.Fill(table);
                        conn.Close();
                        assignddl.DataBind();
                    }
                    assignddl.Items.Insert(0, new ListItem("Select User"));
                    openCloseddl.Enabled = false;
                    if (openCloseddl.SelectedValue == "Open" && type.ToLower().Contains("customized"))
                    {
                        openCloseddl.Enabled = true;
                    }
                }
                //if it's assigned to someone, show only the assigned staff,
                else
                {
                    if (type.ToLower().Contains("customized"))
                    {
                        SqlCommand cmd1 = new SqlCommand("select username from staff where type = 'customized'", conn);
                        conn.Open();
                        SqlDataAdapter ad1 = new SqlDataAdapter(cmd1);
                        ad1.Fill(table);
                        conn.Close();
                        assignddl.DataBind();
                        assignddl.SelectedValue = "Scholarship";
                        if (openCloseddl.SelectedValue == "Open")
                        {
                            openCloseddl.Enabled = true;
                        }
                        assignddl.Items.RemoveAt(1);
                    }
                    else
                    {
                        SqlCommand cmd1 = new SqlCommand("select username from staff where type = 'standard'", conn);
                        conn.Open();
                        SqlDataAdapter ad1 = new SqlDataAdapter(cmd1);
                        ad1.Fill(table);
                        conn.Close();
                        assignddl.DataBind();
                        assignddl.SelectedValue = resultText;
                    }


                }





                if (openCloseddl != null)
                {

                    SqlCommand comm1 = new SqlCommand("SELECT status from request_status WHERE request_id = @request_id and type = @type and description = @description and puc = @puc and quantity = @quantity", conn);
                    comm1.Parameters.AddWithValue("@request_id", request_id);
                    comm1.Parameters.AddWithValue("@type", type);
                    comm1.Parameters.AddWithValue("@description", description);
                    comm1.Parameters.AddWithValue("@puc", puc);
                    comm1.Parameters.AddWithValue("@quantity", quantity);


                    conn.Open();
                    object result1 = comm1.ExecuteScalar();
                    conn.Close();

                    if (result1.ToString() == "Closed")
                    {

                        openCloseddl.SelectedValue = "Closed";
                        openCloseddl.Enabled = false;
                        assignddl.Enabled = false;
                        if ((HttpContext.Current.User.Identity.Name.Equals("DocRequestAdmin")))
                        {
                            assignddl.Enabled = true;
                            openCloseddl.Enabled = true;
                        }
                    }
                }



            }
            catch (Exception ee)
            {
                var error = ee.Message;
                conn.Close();
            }

            var paid = e.Row.Cells[12].Text;
            if (paid.Contains("Not"))
            {
                assignddl.SelectedValue = "Select User";
                assignddl.Enabled = false;
                openCloseddl.Enabled = false;
            }
        }
    }

我相信在这一点上这无关紧要,因为我正在尝试通过 javascript 来做到这一点。

这是网格的截图,我要添加的下拉列表应该存在于最后两列“Assigned To”和“Status”中

【问题讨论】:

  • 对象结果1 = comm1.ExecuteScalar();它只返回一个值,这意味着它只返回第一行的第一列
  • 不要太介意 C# 代码,因为如果我不尝试在我的网页中实现搜索文本框,它在技术上可以完美运行,我要么需要一种方法来实现搜索而无需插入数据表插件, 或实现数据表插件并让它与我的下拉列表一起使用。

标签: javascript c# asp.net web


【解决方案1】:

数据表中有一个内置的渲染函数,您可以在列对象中调用它。 该函数接受 3 个参数,第一个是您在“数据”属性中指定的属性的值,第三个将返回整个底层对象的值。

你可以阅读它here

例如:

     { 
       "data": "username",
       title:"Assigned To",
       visible:true, 
       render: function(data, type, row) { 
        //do sth here 
       } 
     }

在上面的render函数中,data参数会返回“username”属性的值,row参数会返回所有属性的值底层对象。

您可以使用 row 参数提供的数据将值和 id 附加到下拉列表中。 如果您的 row 参数返回一个对象数组,您可以执行一个 for 循环来迭代并将每个值附加到 select 元素。

【讨论】:

  • 你能告诉我我会在渲染函数本身中写什么来附加例如 3 个值作为从下拉列表中选择的选项并将下拉列表本身附加到行吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-30
  • 2021-05-19
  • 2021-10-25
  • 2011-05-03
  • 2013-09-23
  • 2014-12-25
相关资源
最近更新 更多