ورود / ثبت نام
0
0

کار با DropDownList در ASP.NET 4.0 با استفاده از Bootstrap

369 بازدید
DropDownList

DropDownList

در این مقاله با هم خواهیم آموخت که چگونه میتوان یک کنترل چند انتخابی DropDownList در ASP.NET 4.0 با استفاده از Bootstrap ایجاد کرد. برای کار کردن روی پروژه ای که به انتخاب چندگانه DropDownList نیاز داشته باشد، خصوصیات زیر را خواهیم داشت:

فیلتر تکمیل خودکار (Auto complete).

کنترل آن بنا به نیاز کاربر می تواند تک انتخابی و یا چند انتخابی باشد.

به عنوان یک انتخاب چندگانه DropDownList امکان انتخاب همه ی گزینه ها باید وجود داشته باشد.

لیست گزینه های انتخاب شده باید در زیر DropDownList نشان داده شود.

DropDownList

DropDownList

با ASP.NET پیش فرضچنین دسترسی هایی نداریم. اما به هر حال ASP.NET شرایطی را برای ما فراهم می کند که بتوانیم web user control خود را با ترکیب کردن کنترل های دیگر مانند: web server، html controlsو… ایجاد کنیم.

کنترل انتختاب چندگانه Bootstrap با شکل و پیکربندی های متعدی می آید که کاربر می تواند عمل پیش فرض، ظاهر و… آن را تغییر دهد. برای پیکربندی این گزینه ها در کنترل کاربری خودproperties را ایجاد و از آن استفاده کنید که مقادیر ذخیره شده در داخل field های پنهان را نیز تنظیم می کند.

من از VS2013 برای ایجاد وب اپلیکیشن ASP.NET استفاده می کنم. اسم آن را DummyWebApp می گذارم. در solution یک پوشه جدید با نام User Control ایجاد می کنم و در داخل این پوشه یک جز (component ) جدید که اسم آن Web User Control است اضافه می کنم. من اسم web user control خود را AutoCompleteDdl می گذارم.

کد زیر کد AutoCompleteDdl.aspx می باشد.

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="AutoCompleteDdl.ascx.cs" Inherits="UserControl_AutoCompleteDdl" %>  
<div style="width: 380px;" id="divAutoComplete" runat="server">  
    <asp:HiddenField ID="hdnButtonWidth" runat="server" Value="320px" />  
    <asp:HiddenField ID="hdnNonSelectedText" runat="server" Value="--Select--" />  
    <asp:HiddenField ID="hdnIncludeSelectAllOption" runat="server" Value="false" />  
    <asp:HiddenField ID="hdnSelectAllText" runat="server" Value="All" />  
    <asp:HiddenField ID="hdnEnableFiltering" runat="server" Value="False" />  
    <asp:HiddenField ID="hdnEnableFilteringIgnoreCase" runat="server" Value="False" />  
    <asp:HiddenField ID="hdnDisableIfEmpty" runat="server" Value="False" />  
    <asp:HiddenField ID="hdnMaxHeight" runat="server" Value="200" />  
    <asp:HiddenField ID="hdnFilterPlaceholder" runat="server" Value="Search for something..." />  
    <asp:HiddenField ID="hdnAllSelectedText" runat="server" Value="No option left..." />  
    <asp:HiddenField ID="hdnText" runat="server" />  
    <asp:HiddenField ID="hdnValue" runat="server" />  
    <asp:ListBox ID="ddlAutoCompleteSelect" runat="server" Style="width: 350px;"   
        SelectionMode="Multiple">  
    </asp:ListBox>  
    <p>  
        <asp:Label ID="lblSelectedItems" runat="server" Style="word-wrap: break-word; height: 120px;  
            float: left; overflow-y: auto;"></asp:Label>  
    </p>  
</div>  

و می بینید که من از hidden field ها برای نگهداری اطلاعات بین سرور و client استفاده کردم و جعبه (باکس) کوچکاینجا به کاربر اجازه می دهد انتخاب چندگانه یا تکی داشته باشد. Hidden field ها به طورکلی مقادیری که برای پیکربندی یا bootstrap استفاده می شود را حفظ میکنند.می توانیم در مقابل هر hidden field یک کاربر (User) با properties قرار داده ایم و آن کاربر (کاربرانی که از کنترل در صفحه خود استفاده می کنند) فقط نیاز به تنظیم کردن برای گرفتن کنترل کاربر multiselect در Action دارند. اساسا این hidden field ها کنترل انتخاب چندگانه bootstrap ما راتنظیم و پیکربندی می کند.

AutoCompleteDdl.aspx.cs

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Web;  
using System.Web.UI;  
using System.Web.UI.WebControls;  
  
public partial class UserControl_AutoCompleteDdl : System.Web.UI.UserControl  
{  
    #region Variable Declaration  
  
    private string _text;  
    private string _value;  
    private List<SelectModel> _dataSource;  
    private ListSelectionMode _selectionMode;  
    private const string _dataTextField = "Text";  
    private const string _dataValueField = "Value";  
 
    #endregion  
 
    #region Properties  
  
    /// <summary>  
    /// Set the placeholder for the DropDownlist.  
    /// </summary>  
    public string NonSelectedText  
    {  
        get { return hdnNonSelectedText.Value; }  
        set { hdnNonSelectedText.Value = value; }  
    }  
  
    /// <summary>  
    /// Get Or Set the value whether select all option should be there or not.  
    /// </summary>  
    public bool IncludeSelectAllOption  
    {  
        get { return Convert.ToBoolean(hdnIncludeSelectAllOption.Value); }  
        set { hdnIncludeSelectAllOption.Value = Convert.ToString(value); }  
    }  
  
    public bool EnableFiltering  
    {  
        get { return Convert.ToBoolean(hdnEnableFiltering.Value); }  
        set { hdnEnableFiltering.Value = Convert.ToString(value); }  
    }  
  
    /// <summary>  
    /// Configure the Type of DropDownlist it is. For e.g. whether single select or multi select.  
    /// </summary>  
    public ListSelectionMode SelectionMode  
    {  
        get { return _selectionMode; }  
        set  
        {  
            _selectionMode = value;  
            if (value == ListSelectionMode.Single)  
            {  
                ddlAutoCompleteSelect.SelectionMode = ListSelectionMode.Single;  
            }  
            else  
            {  
                ddlAutoCompleteSelect.SelectionMode = ListSelectionMode.Multiple;  
            }  
        }  
    }  
  
    /// <summary>  
    /// Set the Width of the Combo  
    /// </summary>  
    public string ButtonWidth  
    {  
        get { return hdnButtonWidth.Value; }  
        set  
        {  
            hdnButtonWidth.Value = value;  
            lblSelectedItems.Style.Add("width", hdnButtonWidth.Value);  
        }  
    }  
  
    /// <summary>  
    /// To set text search enabled  
    /// </summary>   
    public bool Enabled  
    {  
        get { return ddlAutoCompleteSelect.Enabled; }  
        set { ddlAutoCompleteSelect.Enabled = value; }  
    }  
  
    /// <summary>  
    /// To set Data Source for Control  
    /// </summary>  
    public List<SelectModel> DataSource  
    {  
        set  
        {  
            _dataSource = value;  
            ddlAutoCompleteSelect.DataSource = value;  
            ddlAutoCompleteSelect.DataBind();  
        }  
    }  
  
    /// <summary>  
    /// To set Text field  
    /// </summary>  
    public string DataTextField  
    {  
        get { return ddlAutoCompleteSelect.DataTextField; }  
        set { ddlAutoCompleteSelect.DataTextField = _dataTextField; }  
    }  
  
    /// <summary>  
    /// To set Value field  
    /// </summary>  
    public string DataValueField  
    {  
        get { return ddlAutoCompleteSelect.DataValueField; }  
        set { ddlAutoCompleteSelect.DataValueField = _dataValueField; }  
    }  
  
    /// <summary>  
    /// Get the value of the Selected Items from the dropdownlist.  
    /// </summary>  
    public string Value  
    {  
        get  
        {  
            string strValue = string.Empty;  
            return hdnValue.Value;  
        }  
    }  
  
    /// <summary>  
    /// Get the text of the Selected Items from the dropdownlist.  
    /// </summary>  
    public string Text  
    {  
        get  
        {  
            string strText = string.Empty;  
            return hdnText.Value;  
        }  
    }  
  
    public bool DisableIfEmpty  
    {  
        get { return Convert.ToBoolean(hdnDisableIfEmpty.Value); }  
        set { hdnDisableIfEmpty.Value = Convert.ToString(value); }  
    }  
  
    public int MaxHeight  
    {  
        get { return Convert.ToInt32(hdnMaxHeight.Value); }  
        set { hdnMaxHeight.Value = Convert.ToString(value); }  
    }  
  
    public string SelectAllText  
    {  
        get { return hdnSelectAllText.Value; }  
        set { hdnSelectAllText.Value = value; }  
    }  
  
    public bool EnableFilteringIgnoreCase  
    {  
        get { return Convert.ToBoolean(hdnEnableFilteringIgnoreCase.Value); }  
        set { hdnEnableFilteringIgnoreCase.Value = Convert.ToString(value); }  
    }  
  
    public string FilterPlaceholder  
    {  
        get { return hdnFilterPlaceholder.Value; }  
        set { hdnFilterPlaceholder.Value = value; }  
    }  
 
 
    #endregion  
  
    protected void Page_Load(object sender, EventArgs e)  
    {  
  
        try  
        {  
            if (!(string.IsNullOrEmpty(hdnText.Value) && string.IsNullOrEmpty(hdnValue.Value)))  
            {  
                var selectedItemsText = hdnText.Value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);  
                var selectedItemsValue = hdnValue.Value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);  
  
                foreach (ListItem item in ddlAutoCompleteSelect.Items)  
                {  
                    if ((selectedItemsText.Contains(item.Text) && selectedItemsValue.Contains(item.Value)))  
                    {  
                        //selecting the item at server side.  
                        item.Selected = true;  
                    }  
                }  
            }  
        }  
        catch (Exception ex)  
        {  
            throw ex;  
        }  
  
    }  
  
  
    protected void Page_PreRender(object sender, System.EventArgs e)  
    {  
        try  
        {  
            //Registering the scripts file used by the user control. Alternatively you can also set these files inside your master page or the web page on which you are going to use it.  
            ScriptManager.RegisterClientScriptInclude(this, this.GetType(), "bootStrapJs", ResolveUrl("~/Scripts/bootstrap.min.js"));  
            ScriptManager.RegisterClientScriptInclude(this, this.GetType(), "bootStrapMultiSelectJs", ResolveUrl("~/Scripts/bootstrap-multiselect.js"));  
            ScriptManager.RegisterClientScriptInclude(this, this.GetType(), "autoCompleteDdlJs", ResolveUrl("~/Scripts/app/AutoCompleteDdl.js"));  
        }  
        catch (Exception ex)  
        {  
            throw ex;  
        }  
    }  
}  

در اینجا فایل script برای کنترل کاربر قرار دارد.

AutoCompleteDdl.js

//Controls  
var labelId = '';  
var hdnTextId = '';  
var hdnValueId = '';  
  
var ddlCntrl = '';  
  
//Property Values Controls  
var hdnButtonWidth = '';  
var hdnNonSelectedText = '';  
var hdnIncludeSelectAllOption = '';  
var hdnSelectAllText = '';  
var hdnEnableFiltering = '';  
var hdnEnableFilteringIgnoreCase = '';  
var hdnDisableIfEmpty = '';  
var hdnMaxHeight = '';  
var hdnFilterPlaceholder = '';  
var hdnAllSelectedText = '';  
  
//Helper variables  
var selectedItemsText = '';  
var selectedItemsValue = '';  
  
//This function is used for converting C# boolean values to   
//Javascript boolean Values.  
function convertToBoolean(value) {  
    return (value === "true");  
}  
  
//Writing function inside the pageLoad function is for rebinding the events after partial postback.  
function pageLoad() {  
    $(document).ready(function () {  
    //Iterating over the no of select element whose Id contains value of "ddlAutoCompleteSelect". This iteration is necessary because on a single page the user control might can be used on   
        //single times or multiple times. For e.g. if the user contorl is placed inside a gridview row, or if the user control is used on some kind of registration forms.  
  
        $("select[id*='ddlAutoCompleteSelect']").each(function () {  
            ddlCntrl = $(this);  
            divUCParent = $(ddlCntrl).parent();  
  
            //retrieving the Id's of the controls/elements  
            labelId = ddlCntrl.attr("id").replace("ddlAutoCompleteSelect", "lblSelectedItems");  
            hdnTextId = ddlCntrl.attr("id").replace("ddlAutoCompleteSelect", "hdnText");  
            hdnValueId = ddlCntrl.attr("id").replace("ddlAutoCompleteSelect", "hdnValue");  
  
            //retrieving the values of the hidden fields/ property values  
            hdnButtonWidth = $("#" + ddlCntrl.attr("id").replace("ddlAutoCompleteSelect", "hdnButtonWidth")).val();  
            hdnNonSelectedText = $("#" + ddlCntrl.attr("id").replace("ddlAutoCompleteSelect", "hdnNonSelectedText")).val();  
            hdnIncludeSelectAllOption = convertToBoolean($("#" + ddlCntrl.attr("id").replace("ddlAutoCompleteSelect", "hdnIncludeSelectAllOption")).val().toString().toLowerCase());  
            hdnSelectAllText = $("#" + ddlCntrl.attr("id").replace("ddlAutoCompleteSelect", "hdnSelectAllText")).val();  
            hdnEnableFiltering = convertToBoolean($("#" + ddlCntrl.attr("id").replace("ddlAutoCompleteSelect", "hdnEnableFiltering")).val().toString().toLowerCase());  
            hdnEnableFilteringIgnoreCase = convertToBoolean($("#" + ddlCntrl.attr("id").replace("ddlAutoCompleteSelect", "hdnEnableFilteringIgnoreCase")).val().toString().toLowerCase());  
            hdnDisableIfEmpty = convertToBoolean($("#" + ddlCntrl.attr("id").replace("ddlAutoCompleteSelect", "hdnDisableIfEmpty")).val().toString().toLowerCase());  
            hdnMaxHeight = $("#" + ddlCntrl.attr("id").replace("ddlAutoCompleteSelect", "hdnMaxHeight")).val();  
            hdnFilterPlaceholder = $("#" + ddlCntrl.attr("id").replace("ddlAutoCompleteSelect", "hdnFilterPlaceholder")).val();  
            hdnAllSelectedText = $("#" + ddlCntrl.attr("id").replace("ddlAutoCompleteSelect", "hdnAllSelectedText")).val();  
  
  
            selectedItemsText = $("#" + hdnTextId).val();  
            selectedItemsValue = $("#" + hdnValueId).val();  
          
         //configuring the bootstrap multiselect with the custom specification which user has set through the properties.  
            $(this).multiselect({  
                buttonWidth: hdnButtonWidth,  
                includeSelectAllOption: hdnIncludeSelectAllOption,  
                enableFiltering: hdnEnableFiltering,  
                enableCaseInsensitiveFiltering: hdnEnableFilteringIgnoreCase,  
                selectAllText: hdnSelectAllText,  
                nonSelectedText: hdnNonSelectedText,  
                disableIfEmpty: hdnDisableIfEmpty,  
                maxHeight: hdnMaxHeight,  
                filterPlaceholder: hdnFilterPlaceholder,  
                allSelectedText: hdnAllSelectedText,  
                buttonText: function (options, select) {  
                    if (options.length === 0) {  
                        return this.nonSelectedText;  
                    }  
                    else if (this.allSelectedText && options.length == $('option', $(select)).length) {  
                        if (this.selectAllNumber) {  
                            return this.allSelectedText + ' (' + options.length + ')';  
                        }  
                        else {  
                            return this.allSelectedText;  
                        }  
                    }  
                    else {  
                        var selected = '';  
                        options.each(function () {  
                            var label = ($(this).attr('label') !== undefined) ? $(this).attr('label') : $(this).text();  
                //forming a list.  
                            selected += "<li>" + label + "</li>";  
                        });  
                        return selected;  
                    }  
                },  
                onChange: function (option, checked, select) {  
  
                    var options = this.getSelected();  
  
                    // resetting the updateButtonText event values  
                    if (this.options.enableHTML) {  
                        $('.multiselect .multiselect-selected-text', this.$container).html(hdnNonSelectedText);  
                    }  
                    else {  
                        $('.multiselect .multiselect-selected-text', this.$container).text(hdnNonSelectedText);  
                    }  
                    $('.multiselect', this.$container).attr('title', hdnNonSelectedText);  
  
                    //setting the Label data by forming a unordered list.  
                    $("#" + labelId).html("<ul>" + this.options.buttonText(options, this.$select) + "</ul>");  
  
                    //resetting the variable values to ''  
                    selectedItemsText = '';  
                    selectedItemsValue = '';  
  
                    //iterating over the selected options and appending it to the variables  
                    $.each(options, function (index, option) {  
                        selectedItemsText += option.text + ",";  
                        selectedItemsValue += option.value + ",";  
                    });  
  
selectedItemsText = selectedItemsText.substring(0, selectedItemsText.lastIndexOf(","));  
selectedItemsValue = selectedItemsValue.substring(0, selectedItemsValue.lastIndexOf(","));  
  
                    //finally storing the value to the respective hidden fields.  
                    $("#" + hdnTextId).val(selectedItemsText);  
                    $("#" + hdnValueId).val(selectedItemsValue);  
                }  
            });  
        });  
      
     //incase of post back get the data from the hiddenField hdnText and hdnValues for restoring it back to the userControl selected values.  
        if (selectedItemsText != '' && selectedItemsValue != '') {  
  
            var selectedTextsArr = selectedItemsText.split(",");  
            var selectedValuesArr = selectedItemsValue.split(",");  
  
            $("#" + divUCParent.attr("id")).children(".btn-group").find("ul.multiselect-container li").each(function () {  
                var currentLI = $(this);  
                var anchorElement = $(this).find("a");  
                if (anchorElement != undefined && anchorElement.length != 0) {  
                    var checkBox = $(anchorElement).children("label[class='checkbox']").children("input[type='checkbox']");  
                    var checkBoxValue = $(checkBox).val();  
  
                    if ($.inArray(checkBoxValue, selectedValuesArr) > -1) {  
                        $(currentLI).addClass("active");  
                        $(checkBox).trigger("change");  
                    }  
                }  
            });  
        }  
  
    });  
}  

نکته:

در script کنترل کاربری، ما روش buttonText انتخاب چندگانه bootstrap را برای عمل کردن به همان صورتی که کنترل کاربر (user control) ام از لیست موارد انتخاب شدهمی خواهد برجستهoverriding)) کرده ایم. که به صورت یک لیست نامرتب نمایش داده می شود.

و در رخداد های onChangeعمل های پیش فرض کنترل انتخاب چندگانه bootstrap را باز نشانی کرده ایم. Bootstrap multiselect dropdown عمل پیش فرض تنظیم کردن متن موارد نتخاب شده روی دکمه عنوان(title) را دارد. در این رخداد این رفتار را باز نشانی کرده ایمو موارد انتخاب شده درون برچسب کنترل زیر کنترل کاربری (user control) را در یک لیست نا مرتب نمایش می دهیم.

اگر به فایل aspx کنترل کاربر نگاه کنید، برای hidden field مقادیر پیش فرض تعیین کرده ام. اگر در یک مورد، کاربر در زمان اجرای user control در صفحه ی خود بود و مقادیر برای آن موارد قابل قبول نبود مقادیر پیش فرض برای آن موارد از hidden field و یا هر مقدار جدید دیگری که توسط کاربر تنظیم شده باشد، استفاده می کند.

در اینجا ما فقط خواصی را می گیریم که برای پیکربندی کنترل bootstrap خود از آن استفاده کنیم. اما جدای از این خواص ها، خواص متعدد دیگری وجود دارد که ممکن است برای پیکربندی اپ شما نیاز باشد.

برای اجرایویزگی های دیگر، باید مثل ما عمل کنید. با ایجاد یک properties در فایل apsx.cs و اضافه کردن یک hidden field جدید در فایل aspx.

کد را در اسکیریپت (script) کنترل کاربری خود برای خواندن مقایر hidden field بنویسید.

حالا کنترل کاربری ما تکمیل شده است و فقط نیاز است که آن را روی صفحه ببریم تا کار کند. برای این کار یک صفحه وب جدید در برنامه اضافه می کنیم و کاربر را در ضفحه خود ثبت می کنیم.

Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>  
  
<%@ Register Src="UserControl/AutoCompleteDdl.ascx" TagName="AutoCompleteDdl" TagPrefix="uc1" %>  
  
<!DOCTYPE html>  
  
<html xmlns="http://www.w3.org/1999/xhtml">  
<head runat="server">  
    <title>Bootstrap Multiselect</title>  
    <link rel="stylesheet" type="text/css" href="http://netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css" />  
    <link rel="stylesheet" type="text/css" href="Style/bootstrap-multiselect.css" />  
    <script src="Scripts/jquery-1.9.1.min.js"></script>  
</head>  
<body>  
    <form id="form1" runat="server">  
        <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>  
        <div class="container">  
            <div class="row">  
                <div class="col-md-12">  
                    <h3>Bootstrap MultiSelect Dropdownlist</h3>  
                    <asp:UpdatePanel ID="udpMain" runat="server">  
                        <ContentTemplate>  
  
                            <uc1:AutoCompleteDdl ID="ddlAutoComplete" runat="server" IncludeSelectAllOption="false"  
                                ButtonWidth="320px" SelectAllText="All" NonSelectedText="--Select Option--" MaxHeight="400"  
                                EnableFiltering="true" FilterPlaceholder="Search For Something..." SelectForm="Multiple"  
                                PlaceHolder="Select a Value" />  
                            <p>  
                                <asp:Button ID="btnGet" runat="server" Text="Get Data" OnClick="btnGet_Click" />  
                            </p>  
                            <p>  
                                <asp:Label ID="lblData" runat="server" />  
                            </p>  
                        </ContentTemplate>  
                    </asp:UpdatePanel>  
                </div>  
            </div>  
        </div>  
    </form>  
</body>  
</html>  

نکته: در اینجا کاربر را به صفحه اضافه کردیم.

Default.aspx.cs

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Web;  
using System.Web.UI;  
using System.Web.UI.WebControls;  
  
public partial class _Default : System.Web.UI.Page  
{  
    List<SelectModel> lstData = new List<SelectModel>();  
  
    protected void Page_Load(object sender, EventArgs e)  
    {  
        if (!IsPostBack)  
        {  
            for (int i = 0; i < 100; i++)  
            {  
                lstData.Add(new SelectModel() { Value = "Item " + i, Text = "Item " + i });  
            }  
            ddlAutoComplete.DataValueField = "Value";  
            ddlAutoComplete.DataTextField = "Text";  
            //Setting the data source for the dropdownlist  
            ddlAutoComplete.DataSource = lstData;  
        }  
    }  
    protected void btnGet_Click(object sender, EventArgs e)  
    {  
        string value = ddlAutoComplete.Value;  
        string text = ddlAutoComplete.Text;  
  
        lblData.Text = "<b>Value: </b>" + value + "<br/><b>Text: </b>" + text;  
  
    }  
}  

حالا اپلیکیشن را اجرا کنید، خروجی زیر را مشاهده می کنید.

DropDownList

چند مورد از dropdownlist انتخاب کنید و موارد انتخاب شده را در زیر dropdownlist در یک لیست نا مرتب مشاهده خواهید کرد.

DropDownList

هم چنین ممکن است که شما بخواهید اطلاعات رابا نوشتن کلمه ای در جعبه [Search For Something] فیلتر کنید:

DropDownList

زمانی که می خواهید مقادیر را در فیلتر textbox وارد کنید، مطمئن شوید که در یک حالت مناسب انجام می دهید تا زمانی که بتوانید ویژگی EnableFilteringIgnoreCase را به حالت پیش فرض تنظیم کنید.

DropDownList

حالا نکته، اجرا اطلاعات بین postback می باشد. برای تست کردن این یک دکمه کنترلGet Data و یک برچسب کنترل برای نمایش متن و مقدار آنروی صفحه اضافه می کنیم. فقط کافی است روی دکمه Get Data کلیک کنید و بعد از postback خروجی به صورت زیر خواهد بود.

DropDownList

موفق باشید !

آیا این مطلب را می پسندید؟
https://www.mspsoft.com/?p=16550
اشتراک گذاری:
واتساپتوییترفیسبوکپینترستلینکدین
داریوش فرخی
داریوش فرخی هستم از سال 92 شروع به یادگیری برنامه نویسی و از سال 93 در بخش برنامه نویسی و تولید محتوای سایت mspsoft.com مشغول هستم. فعالیتم نیز بیشتر در زمینه های برنامه نویسی با سی شارپ و asp.net بوده است. اوقات فراغتم را هم غالبا با تماشای فیلم یا بازی های کامپیوتری پر میکنم .
مطالب بیشتر
برچسب ها:

نظرات

0 نظر در مورد کار با DropDownList در ASP.NET 4.0 با استفاده از Bootstrap

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

هیچ دیدگاهی نوشته نشده است.