Hướng dẫn Simple CRM

Hôm nay  mình hướng dẫn các bạn sử dụng Simple (Quản lý khách hàng của mình)

Đăng Nhập
(user/pass: admin/admin)

vào list quản lý khách hàng


Thêm, Sửa và Xóa khách hàng



lấy dữ liệu từ file Exel vào (Got Error ) lấy lỗi khi không đúng hoặc bị trùng

Quản lý user 


Bạn có thể download phần mềm ở link sau: SIMPLE CRM


Lưu ý : Đây là phân mêm web nên có  phải cài đặt trên hosting hoặc server 
Yêu cầu: .Net 4.5 và SQL server 2012

Chúc các bạn thành công
C# Loại bỏ những ký tự lạ để làm URL cho site - the remove illegal characters



// using System.Web;

public static string RemoveIllegalCharacters(string text)
{
    if (string.IsNullOrEmpty(text))
    {
         return text;
    }
    text = text.Replace(":", string.Empty);
    text = text.Replace("/", string.Empty);
    text = text.Replace("?", string.Empty);
    text = text.Replace("#", string.Empty);
    text = text.Replace("[", string.Empty);
    text = text.Replace("]", string.Empty);
    text = text.Replace("@", string.Empty);
    text = text.Replace("*", string.Empty);
    text = text.Replace(".", string.Empty);
    text = text.Replace(",", string.Empty);
    text = text.Replace("\"", string.Empty);
    text = text.Replace("&", string.Empty);
    text = text.Replace("'", string.Empty);

    text = text.Replace("–", "-"); // live writer passes char 8211  this inplace of a char 45 for hyphen
    text = RemoveUnicodePunctuation(text); // moves any unicode versions of punctuation

    text = text.Replace(" ", "-");
    text = RemoveDiacritics(text);
    text = RemoveExtraHyphen(text);

    return HttpUtility.HtmlEncode(text).Replace("%", string.Empty);
}

// loại bỏ những kỹ dấu

private static string RemoveDiacritics(string text)
{
    var normalized = text.Normalize(NormalizationForm.FormD);
    var sb = new StringBuilder();
    foreach (var c in
        normalized.Where(c => CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark))
    {
        sb.Append(c);
    }

    return sb.ToString();
}

// Loại bỏ 2 gạch nối - the text with the extra hyphen removed
private static string RemoveExtraHyphen(string text)
{
    if (text.Contains("--"))
    {
         text = text.Replace("--", "-");
         return RemoveExtraHyphen(text);
    }
    return text;
}

// The string with the punctuation removed.
private static string RemoveUnicodePunctuation(string text)
{
    var normalized = text.Normalize(NormalizationForm.FormD);
    var sb = new StringBuilder();

    foreach (var c in
        normalized.Where(c => CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.InitialQuotePunctuation &&
                                      CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.FinalQuotePunctuation))
    {
        sb.Append(c);
    }

    return sb.ToString();
}


C# Loại bỏ những ký tự lạ để làm URL cho site - the remove illegal characters





C# Kiểm tra giá trị ipv 6 - validates an ipv6 address



// using System.Net

public static bool IsIpV6AddressValid(string address)
{
    if (!string.IsNullOrWhiteSpace(address))
    {
         IPAddress ip;
         if (IPAddress.TryParse(address, out ip))
         {
              return ip.AddressFamily == AddressFamily.InterNetworkV6;
         }
    }
    return false;
}

C# Kiểm tra giá trị ipv 6 - validates an ipv6 address
Kiểm tra giá trị IPv 4 - validates an IPv4 address


private static readonly Regex validIpV4AddressRegex = new Regex
(@"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$", RegexOptions.IgnoreCase);

public static bool IsIpV4AddressValid(string address)
{
     if (!string.IsNullOrWhiteSpace(address))
     {
          return validIpV4AddressRegex.IsMatch(address.Trim());
     }
     return false;
}

Kiểm tra giá trị IPv 4 - validates an IPv4 address
kiểm tra giá trị email - validates an email address


private static readonly Regex emailRegex = new Regex(
 @"^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$", RegexOptions.IgnoreCase)
public static bool IsEmailValid(string email)
{
     if (!string.IsNullOrWhiteSpace(email))
     {
          return emailRegex.IsMatch(email.Trim());
     }

     return false;
}

kiểm tra giá trị email - validates an email address
Hàm tạo mật khẩu ngẩu nhiên - funtion random password



public static string RandomPassword(int number)
{
     var chars = "abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
     var password = string.Empty;
     var random = new Random();
     for (var i = 0; i < number; i++)
     {
         var x = random.Next(1, chars.Length);
         if (!password.Contains(chars.GetValue(x).ToString()))
         {
                    password += chars.GetValue(x);
         }
         else
         {
              i--;
          }
     }

     return password;
}

Hàm tạo mật khẩu ngẩu nhiên - funtion random password
Hàm Get sudomain in trong URL - The URL to get the sub domain from


public static string GetSubDomain(Uri url)
{      
   if (url.HostNameType == UriHostNameType.Dns)
   {
         var host = url.Host;
         if (host.Split('.').Length > 2)
         {
               var lastIndex = host.LastIndexOf(".");
               var index = host.LastIndexOf(".", lastIndex - 1);
               return host.Substring(0, index);
          }
    }

    return null;
}
Hàm Get sudomain in trong URL - The URL to get the sub domain from

Lấy danh sách URL theo kiểu file trong html - A list of Uri in HTML


public List<Uri> FindLinks(string type, string html)
{
     var matches = Regex.Matches(
           html, string.Format(Pattern, type), RegexOptions.IgnoreCase | RegexOptions.Singleline);
     var urls = new List<Uri>();

     foreach (var hrefMatch in
     matches.Cast<Match>().Where(match => match.Groups.Count == 2).Select(match => match.Groups[1].Value).
     Select(link => HrefRegex.Match(link)).Where(hrefMatch => hrefMatch.Groups.Count == 2))
     {
          Uri url;
          var value = hrefMatch.Groups[1].Value;
          if (Uri.TryCreate(value, UriKind.Absolute, out url))
          {
               urls.Add(url);
          }
      }

      return urls;
}

Get danh sách URL theo kiểu file trong html - A list of Uri in HTML
Hàm chuyển đổi kiểm dữ liệu sang JSON - Converts an object to its JSON representation


public string ConvertToJson (object obj)
{
     return new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(obj);

}
Hàm chuyển đổi kiểm dữ liệu sang JSON - Converts an object to its JSON representation
Hàm loại bỏ dấu trong chuổi - the string with the diacritics removed


public string  RemovDicritics (string newcustomer)
{ 
            var normalized = text.Normalize(NormalizationForm.FormD);
            var sb = new StringBuilder();

            foreach (var c innormalized.Where(c => 
                    CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark))
            {
                sb.Append(c);
            }

            return sb.ToString();

}

Chúc các bạn thành công  "Hàm loại bỏ dấu trong chuổi"
ASPxTreeList trong dvexpress sử dụng Entity Framework


Mình hướng dẫn các bạn tìm hiểu ở mức cơ bản để có thể sử dụng Tree List.
Trước hết các bạn truy cập vào link sau:

https://demos.devexpress.com/ASPxTreeListDemos/Default.aspx

để mình tham khảo các chức năng mình mong muốn trong dự án của mình.

Quang trọng nhất của của ASPxTreeList có Column ParentFieldName và KeyFieldName là 2 key để làm ID Cha (ParentCustomerID) và ID con (CustomerID)









Các tính năng giống như bên ASPxGridview Các bạn có thể tham khảo bên mục 

http://www.ini.vn/2016/08/tim-hieu-control-aspxgridview-trong3.html

Khi các bạn tìm hiểu ASPxGridview hay ASPxTreeList các bạn tìm hiểu về các columns mà 
dvexpress hỗ trợ và 




Hoặc settings của nó 


ví dụ : phân trang 
nằm trong mục SettingsPager trên mục Properties
hoặc việc trực tiếp trong code  <SettingsPager PageSize="10"></SettingsPager>

Các bạn nên tìm hiểu một ít về ClientInstanceName, ClientSideEvents
Về ClientInstanceName là có thể xem là một id trong javascript và ClientSideEvents là một sự kiện để gọi và phương thực javascript mà dvexpress hỗ trợ rất mạnh về vấn đề này để hỗ trợ cho người lập trình, điều chỉnh linh hoạt và nhanh hơn ở phần client trình duyệt.
Tìm hiều  ASPxClientGridView,  ASPxClientTreeList ................ trên document của nó
Có thể mình sẽ nói vấn đề này ở một bài khác với control Callback của dvexpress.

Chúc các bạn thành công!

ASPxGridView trong Devexpress phần 3




Tìm hiều Grid Editing:

Grid Editing là phần quan trọng nhất của ASPxGridView vì nó chỉnh thêm hoặc chỉnh sửa trên GridView.

Mình hướng dẫn các bản theo hướng Edit Form Templates để bạn có thể tùy chỉnh phần edit vì mặc định sẽ lấy theo form hiển thị.

Ở phần này  mình sẽ tạo project mới để các bạn dễ hiểu hơn  với 1 table Costumer.




hoặc bạn có thể download script  sau để chạy :  DataCustomer




Đầy là source hiển thị edit mặc định 







Quan trọng nhất KeyFieldName các bạn để nó mã guid() đây là column mà các bạn sử dụng nó một key để tìm thấy row đó.




Khi bạn nhấn Edit thì trên lấy Column hiển thị vào Edit nên ta không thể tuy chỉnh được.


 <SettingsEditing Mode=""/>

Mode ="Batch"  kiểu này sử dụng edit trên từng cell mình sẽ hướng dẫn ở bài khác.

Mode="Inline"   edit trên một dòng 
Mode="EditForm"  edit  bằng Form trên dòng
Mode="EditFormAndDisplayRow
Mode="PopupEditForm"  Hiện ra Popup

Bạn truy cập vào đây để xem nhé.

https://demos.devexpress.com/ASPxGridViewDemos/GridEditing/EditModes.aspx

Tất cả các kiểu update trên đều có thể quy về một kiểu Templates để mình EditForm theo ý muốn của mình.

Chúng ta bắt đầu SettingsEditting Mode = EditForm


Đây là đoạn Templates



Sử dụng Template


Load, Delete Customer


      Tạo mới user và Edit



Get một Customer




Khi các bạn chọn Edit thì load nội dung cần edit vào thì nó không tự load vào cho vì mình đã tùy chỉnh Form theo ý mình rồi vậy các bạn phải  sử dụng 

hàm StartRowEditing lưu vào viewstate trước rồi sử dụng hàm Oninit của control phía trong rồi load nó lên.


https://documentation.devexpress.com/#AspNet/clsDevExpressWebASPxGridViewtopic

Các bạn có thể Xem video ở dưới:

Phần 1:





Phần 2: