/* // SDLInitializerで一括して行なうことにした。 * /// <summary> * /// static class constructorはlazy instantiationが保証されているので * /// ここで SDL_imageが間接的に読み込むdllを事前に読み込む。 * /// </summary> * static Surface() * { * // image関連のDLLを必要ならば読み込んでおくべ。 * * DllManager d = DllManager.Instance; * string current = DllManager.DLL_CURRENT; * d.LoadLibrary(current, DLL_SDL_IMAGE); * d.LoadLibrary(current, DLL_ZIP); * d.LoadLibrary(current, DLL_PNG); * d.LoadLibrary(current, DLL_JPEG); * d.LoadLibrary(current, DLL_TIFF); * } */ /// <summary> /// /// </summary> public Surface() { This = this; CacheSystem = UnmanagedResourceManager.Instance.VideoMemory; CacheSystem.Add(this); }
/// <summary> /// Loadで読み込んだものの解放するにはReleaseを呼び出すべし。 /// Disposeのほうは、Disposeしたあとは再度Load出来ない。 /// </summary> public void Dispose() { Release(); init.Dispose(); CacheSystem.Remove(this); }
/// <summary> /// loadChunkで読み込んだサウンドをfadeさせる /// </summary> /// <param name="speed"></param> /// <returns></returns> private YanesdkResult PlayChunkFade(int speed) { CacheSystem.OnAccess(this); isPlayingLast = true; if (NoSound) { return(YanesdkResult.PreconditionError); } int ch = (chunkChannel == 0) ? // おまかせchunkでの再生ならば空きチャンクを探す ch = ChunkManager.GetEmptyChunk(this) : ch = chunkChannel - 1; // チャンネルの占拠を明示 ChunkManager.chunk[ch] = this; // ↑このチャンクが使用中であることはここで予約が入る // volumeの設定(これは再生時に設定する) ChunkManager.SetVolume(ch + 1, Volume); return(SDL.Mix_FadeInChannel(ch, chunk, loopflag, speed) == ch ? YanesdkResult.NoError : YanesdkResult.SdlError); }
/// <summary> /// ファイル(ogg,wav)の読み込み。 /// </summary> /// <param name="name"></param> /// <param name="ch"> /// 読み込むチャンクを指定。ch=0なら自動で空きを探す 1~8</param> /// <returns></returns> private YanesdkResult LoadChunk(string name, int ch) { if (NoSound) { return(YanesdkResult.PreconditionError); } SDL_RWopsH rwops = FileSys.ReadRW(name); if (rwops.Handle != IntPtr.Zero) { chunk = SDL.Mix_LoadWAV_RW(rwops.Handle, 1); } else { return(YanesdkResult.FileNotFound); // file not found } if (chunk == IntPtr.Zero) { return(YanesdkResult.FileReadError); // 読み込みに失敗してやんの } chunkChannel = ch; CacheSystem.OnResourceChanged(this); return(YanesdkResult.NoError); }
/// <summary> /// SDL_Surafceを渡し、それをテクスチャーとする /// このときこのクラスで設定されているColorKeyは考慮されない /// </summary> /// <remarks> /// ここで渡したsurface自体は解放されないし、破壊もされない。 /// </remarks> /// <param name="surface"></param> /// <returns></returns> public YanesdkResult SetSurface(IntPtr surface) { Release(); YanesdkResult result; if (surface == IntPtr.Zero) { result = YanesdkResult.InvalidParameter; } else { using (Surface tmpSurface = new Surface()) { tmpSurface.SDL_Surface = surface; result = InnerSetSurface(tmpSurface, true); // surface,dup/init // 渡したSurfaceを破壊してはいけないので trueを指定する。 tmpSurface.Unbind_SDL_Surface(); // 戻しとかないとtmpSurfaceが解放されるときにここで設定したsurfaceが // 勝手に解放されてしまう。 } } // リソースサイズが変更になったことをcache systemに通知する CacheSystem.OnResourceChanged(this); return(result); }
/// <summary>サーフェースに文字列を描画します。</summary> /// <remarks> /// サーフェースをnewしたくないときは、こちらを使うよろし。 /// </remarks> public void DrawSolidUnicode(Surface surface, string str) { CacheSystem.OnAccess(this); if (font != IntPtr.Zero) { SDL.TTF_SetFontStyle(font, style); IntPtr image = SDL.TTF_RenderUNICODE_Solid(font, str, color); RateCheck(ref image); /* * // debug目的でsurfaceの種類を調べるためのコード * unsafe * { * SDL.SDL_PixelFormat* format = (SDL.SDL_PixelFormat*)((SDL.SDL_Surface*)image)->format; * int alpha = format->alpha; * } * // 8bppのsurfaceが戻ってきているな… */ // ここで取得されるsurfaceは転送元color keyを設定されているので // これを設定するとalphaつきのsurfaceになってしまうのだが…(´ω`) // どうしたもんかの…。 surface.SDL_Surface = image; // .setSurface(image); } else { surface.SDL_Surface = IntPtr.Zero; // setSurface(IntPtr.Zero); } }
/// <summary>指定されたファイル名の画像を読み込む。</summary> /// <remarks> /// /// ここで読み込んだリソースは、VideoCache(→UnmanagedResourceManager)が /// いっぱいになると自動的に解放する。 /// /// Bindするときにそのチェックを行ない、解放されていれば自動的に再構築するので /// 通常、意識する必要は無いが、解放~再構築されることがあるので /// ここで読み込んだテクスチャのピクセルを直接いじってはいけない。 /// /// 直接いじりたいなら、まずSurfaceに読み込ませて、それをSetSurfaceで設定してから /// 使うこと。あるいは、解放されないようにVideoCacheのLimitを調整するか、 /// 毎フレーム使用するなどして、解放されないようにすること。 /// </remarks> public YanesdkResult Load(string filename) { Release(); using (Surface tmpSurface = new Surface()) { YanesdkResult result = tmpSurface.Load(filename); if (result == YanesdkResult.NoError) { result = InnerSetSurface(tmpSurface, false); // surface,dup/init } if (result == YanesdkResult.NoError) { this.fileName = filename; // もし、ローダー以外からファイルを単に読み込んだだけならば、Reconstructableにしておく。 if (constructInfo == null) { constructInfo = new TextrueConstructAdaptor(filename, this.ColorKey); } // リソースサイズが変更になったことをcache systemに通知する // Releaseのときに0なのは通知しているので通知するのは正常終了時のみでok. CacheSystem.OnResourceChanged(this); } return(result); } }
public GlTexture() { This = this; // CacheObjectにmix-inするときのthisを渡す必要がある。 // defaultでUnmanagedResourceManagerのcache systemに接続 CacheSystem = UnmanagedResourceManager.Instance.VideoMemory; CacheSystem.Add(this); }
/// <summary> /// /// </summary> public Font() { This = this; // mix-in classにthisを渡す // defaultでUnmanagedResourceManagerのcache systemに接続 CacheSystem = UnmanagedResourceManager.Instance.UnmanagedMemory; CacheSystem.Add(this); SetColor(255, 255, 255); }
/// <summary> /// Pauseで停止させていたならば、 /// それを前回停止させていた再生ポジションから再開する。 /// </summary> /// <returns></returns> public YanesdkResult Resume() { CacheSystem.OnAccess(this); isPlayingLast = true; if (NoSound) { return(YanesdkResult.NoError); } return(ChunkManager.Resume(this)); }
/// <summary> /// static class constructorはlazy instantiationが保証されているので /// ここで SDL_mixerが間接的に読み込むdllを事前に読み込む。 /// </summary> /* SDL_Initializerで行なうように変更 * static Sound() * { * // Sound関連のDLLを必要ならば読み込んでおくべ。 * * DllManager d = DllManager.Instance; * string current = DllManager.DLL_CURRENT; * d.LoadLibrary(current, DLL_OGG); * d.LoadLibrary(current, DLL_VORBIS); * d.LoadLibrary(current, DLL_VORBISFILE); * d.LoadLibrary(current, DLL_SMPEG); * } */ /// <summary> /// コンストラクタでは、Audioデバイスの初期化も行なう。 /// </summary> public Sound() { This = this; // mix-in用 // Audioデバイスの初期化。 // SoundConfig.Update(); // ↑これは、initがコンストラクタで行なう CacheSystem = UnmanagedResourceManager.Instance.SoundMemory; CacheSystem.Add(this); }
public void Release() { if (Bitmap != null) { Bitmap.Dispose(); bitmap = null; loaded = false; fileName = null; CacheSystem.OnResourceChanged(this); } }
/// <summary> /// play中のサウンドを停止させる /// </summary> /// 読み込んでいるサウンドデータ自体を解放するには release を /// 呼び出すこと。こちらは、あくまで停止させるだけ。次にplayが /// 呼び出されれば、再度、先頭から再生させることが出来る。 /// <returns></returns> public YanesdkResult Stop() { CacheSystem.OnAccess(this); isPlayingLast = false; // stopは、channelごとに管理されているので、 // 自分が再生しているchannelなのかどうかを // このクラスが把握している必要がある if (NoSound) { return(YanesdkResult.NoError); } return(ChunkManager.Stop(this)); }
/// <summary>サーフェースに文字列を描画します。</summary> /// <remarks> /// サーフェースをnewしたくないときは、こちらを使うよろし。 /// </remarks> public void DrawBlended(Surface surface, string str) { CacheSystem.OnAccess(this); if (font != IntPtr.Zero) { SDL.TTF_SetFontStyle(font, style); IntPtr image = SDL.TTF_RenderText_Blended(font, str, color); RateCheck(ref image); surface.SDL_Surface = image; // setSurface(image); } else { surface.SDL_Surface = IntPtr.Zero; // setSurface(IntPtr.Zero); } }
/// <summary> /// Loadで読み込んだものの解放 /// Disposeのほうは、Disposeしたあとは再度Load出来ない。 /// </summary> public void Release() { if (bOpen) { SDL.TTF_CloseFont(font); bOpen = false; font = IntPtr.Zero; Marshal.FreeHGlobal(rwops.hMem); bufferSize = 0; fileName = null; CacheSystem.OnResourceChanged(this); constructInfo = null; } }
/// <summary> /// テクスチャーを貼り付けるときに使う /// </summary> /// <remarks> /// この関数を呼び出したあと、 /// <code> /// glBegin(GL_POLYGON); /// glTexCoord2f(0 , 0); glVertex2f(-0.9 , -0.9); /// glTexCoord2f(0 , 1); glVertex2f(-0.9 , 0.9); /// glTexCoord2f(1 , 1); glVertex2f(0.9 , 0.9); /// glTexCoord2f(1 , 0); glVertex2f(0.9 , -0.9); /// glEnd(); /// </code> /// のようにすれば、テクスチャーをポリゴンにはりつけることが出来ます。 /// /// ※ OpenGLのコードが混在するのが嫌なら使わないで。 /// </remarks> public void Bind() { // bindのタイミングでcache systemにこのテクスチャを使用したことを通知する CacheSystem.OnAccess(this); if (loaded) { if (textureType == Gl.GL_TEXTURE_RECTANGLE_ARB) { Gl.glEnable(Gl.GL_TEXTURE_RECTANGLE_ARB); } Gl.glBindTexture(textureType, textureName); } }
unsafe private void DrawSolidUTF8_(Surface surface, byte[] str) { CacheSystem.OnAccess(this); if (font != IntPtr.Zero && str.Length > 0) { SDL.TTF_SetFontStyle(font, style); Array.Resize(ref str, str.Length + 1); // C文字列用の終端の '\0' を追加。 IntPtr image = SDL.TTF_RenderUTF8_Solid(font, str, color); RateCheck(ref image); surface.SDL_Surface = image; // setSurface(image); } else { surface.SDL_Surface = IntPtr.Zero; // setSurface(IntPtr.Zero); } }
/// <summary> /// loadMusicで読み込んだBGMをfadeさせる /// </summary> private YanesdkResult PlayMusicFade(int speed) { CacheSystem.OnAccess(this); isPlayingLast = true; if (NoSound) { return(YanesdkResult.PreconditionError); } ChunkManager.music = this; // チャンネルの占拠を明示 // volumeの設定(これは再生時に設定する) ChunkManager.SetVolume(0, Volume); return(SDL.Mix_FadeInMusic(music, loopflag, speed) == 0 ? YanesdkResult.NoError : YanesdkResult.SdlError); }
public YanesdkResult Load(string filename) { bitmap = BitmapHelper.LoadToBitmap(filename); if (bitmap == null) { return(YanesdkResult.FileReadError); } // 一回読み込みに失敗したら、アクセス毎に読み込みに行くのを // 防止するために、もう読み込まないほうがいいと思うのだが loaded = true; fileName = filename; CacheSystem.OnResourceChanged(this); return(YanesdkResult.NoError); }
/// <summary> /// フェードイン付きのplay。speedはfade inに必要な時間[ms] /// </summary> /// <param name="speed"></param> /// <returns></returns> public YanesdkResult PlayFade(int speed) { CacheSystem.OnAccess(this); isPlayingLast = true; if (NoSound) { return(YanesdkResult.NoError); } Stop(); // 停止させて、sound managerの再生チャンネルをクリアしなければ if (music != IntPtr.Zero) { return(PlayMusicFade(speed)); } if (chunk != IntPtr.Zero) { return(PlayChunkFade(speed)); } return(YanesdkResult.PreconditionError); // Sound読み込んでないぽ }
/// <summary> /// サウンドファイルを読み込む /// </summary> /// <param name="filename">ファイル名</param> /// <param name="ch">読み込むチャンネル /// -1 : musicチャンネル /// 0 : 1~8のchunkのうち再生時(play)に再生していないチャンネルをおまかせで /// 1~8 : chunkに読み込む /// </param> /// <returns>読み込みエラーならばYanesdkResult.no_error以外</returns> public YanesdkResult Load(string filename, int ch) { Release(); YanesdkResult result; if (ch == -1) { result = LoadMusic(filename); } else if (ch == 0) { result = LoadChunk(filename); } else if (1 <= ch && ch <= 8) { result = LoadChunk(filename, ch); } else { result = YanesdkResult.InvalidParameter; } // errorですよ、と。 if (result == YanesdkResult.NoError) { loaded = true; this.fileName = filename; // もし、ローダー以外からファイルを単に読み込んだだけならば、Reconstructableにしておく。 if (constructInfo == null) { constructInfo = new SoundConstructAdaptor(filename, ch); } // リソースサイズが変更になったことをcache systemに通知する // Releaseのときに0なのは通知しているので通知するのは正常終了時のみでok. CacheSystem.OnResourceChanged(this); } return(result); }
/// <summary> /// loadで読み込んだサウンドを再生する /// </summary> /// <returns> /// 再生エラーならばYanesdkResult.no_error以外が返る /// </returns> public YanesdkResult Play() { // cache systemにこのSoundを使用したことを通知する CacheSystem.OnAccess(this); isPlayingLast = true; if (NoSound) { return(YanesdkResult.NoError); } Stop(); // 停止させて、sound managerの再生チャンネルをクリアしなければ if (music != IntPtr.Zero) { return(PlayMusic()); } if (chunk != IntPtr.Zero) { return(PlayChunk()); } return(YanesdkResult.PreconditionError); // Sound読み込んでないぽ }
/// <summary> /// サーフェースの解放 /// </summary> public void Release() { if (surface != IntPtr.Zero) { SDL.SDL_FreeSurface(surface); // フォントを使ったときに↑ここでアクセス違反が出るなら // SDL_ttf.dllのバージョンが古い。 // 詳しくはYanesdk.NETのreadme.txtの更新履歴2006/10/28を見ること。 surface = IntPtr.Zero; } if (RWopsH.hMem != IntPtr.Zero) { global::System.Runtime.InteropServices.Marshal.FreeHGlobal(RWopsH.hMem); RWopsH.hMem = IntPtr.Zero; RWopsH.Handle = IntPtr.Zero; } fileName = null; CacheSystem.OnResourceChanged(this); // this.alpha = false; // defaultでfalse }
/// <summary> /// loadで読み込んだサウンドを解放する /// </summary> public void Release() { if (music != IntPtr.Zero) { Stop(); SDL.Mix_FreeMusic(music); music = IntPtr.Zero; } if (chunk != IntPtr.Zero) { Stop(); SDL.Mix_FreeChunk(chunk); chunk = IntPtr.Zero; } tmpFile = null; loaded = false; fileName = null; // リソースサイズが変更になったことをcache systemに通知する CacheSystem.OnResourceChanged(this); constructInfo = null; }
/// <summary>サーフェースに文字列を描画します。</summary> /// <remarks> /// サーフェースをnewしたくないときは、こちらを使うよろし。 /// </remarks> public void DrawBlendedUnicode(Surface surface, string str) { CacheSystem.OnAccess(this); if (font != IntPtr.Zero) { SDL.TTF_SetFontStyle(font, style); IntPtr image = SDL.TTF_RenderUNICODE_Blended(font, str, color); RateCheck(ref image); // debug目的でsurfaceの種類を調べるためのコード unsafe { SDL.SDL_PixelFormat *format = (SDL.SDL_PixelFormat *)((SDL.SDL_Surface *)image)->format; int alpha = format->alpha; } surface.SDL_Surface = image; // setSurface(image); } else { surface.SDL_Surface = IntPtr.Zero; // setSurface(IntPtr.Zero); } }
/// <summary>フォントをオープンする(RWopsから)。</summary> /// <remarks> /// indexは、ttc(true type collection=ttfが複数入ったフォントファイル)の /// ときに、何番目のものかを指定する。0番から始まる番号。 /// </remarks> public YanesdkResult Load(SDL_RWopsH rw, int fontsize, int index) { Release(); if (fontsize <= 0 || rw.Handle == IntPtr.Zero) { return(YanesdkResult.InvalidParameter); } // 23pt未満であれば倍率掛けて拡大しておく rate = 1; // while (fontsize * rate < 23) ++rate; // ↑この処理、Soildで描画するときにおかしくなるので廃止にしよう。 // フォントが23pt以下だと拡大する処理について。 // SDL_ttf.dllが古いと↑これを入れないといけない。 // 詳しくはYanesdk.NETのreadme.txtの更新履歴2006/10/28を見ること。 font = SDL.TTF_OpenFontIndexRW(rw.Handle, 1, fontsize * rate, index); if (font != IntPtr.Zero) { // 読みこめたので、これをファイルサイズとする。 bufferSize = rw.Length; bOpen = true; rwops = rw; } if (font == IntPtr.Zero) { return(YanesdkResult.FileReadError); } // fileName = ファイル名不明(´ω`) CacheSystem.OnResourceChanged(this); return(YanesdkResult.NoError); }
public async Task <ActionResult> EditActiveDirectoryUser(string emailAddress) { ViewBag.SystemAdmin = false; var identity = (System.Security.Claims.ClaimsIdentity)User.Identity; var claims = identity.Claims; string SystemAdmin = claims.FirstOrDefault(x => x.Type == "SystemAdmin")?.Value; if (SystemAdmin == "True") { ViewBag.SystemAdmin = true; } var token = GetToken(); var roles = await IzendaUtilities.GetRoles(token); var employeeList = CacheSystem.GetCacheItem("combinedList") as List <UserDetail>; var employee = (from e in employeeList where e.EmailAddress == emailAddress select e).FirstOrDefault(); var userRoles = roles.Where(t => t.Users.Contains(employee)).ToList(); var userRolesIds = new string[userRoles.Count]; var length = userRoles.Count; for (var i = 0; i < length; i++) { userRolesIds[i] = userRoles[i].Id.ToString(); } var rolesList = new MultiSelectList(roles.ToList().OrderBy(i => i.Name), "Id", "Name", userRolesIds); employee.RoleOptions = rolesList; return(View(employee)); }
/// <summary> /// サーフェースへの画像読み込みメソッド。 /// </summary> /// <param name="filename"></param> /// <returns>読み込み失敗のときは非0が返る。</returns> /// <remarks> /// bmp画像,png画像を読み込みサポート。 /// </remarks> public YanesdkResult Load(string filename) { RWopsH = FileSys.ReadRW(filename); if (RWopsH.Handle != IntPtr.Zero) { surface = SDL.IMG_Load_RW(RWopsH.Handle, 0); if (surface != IntPtr.Zero) { // // この時点でsurfaceのαチャンネルの有無を判定して、メンバalphaに反映させる必要あり。 // alpha = getAlpha(surface); // →α channelの判定は動的に行なうように変更する fileName = filename; CacheSystem.OnResourceChanged(this); return(YanesdkResult.NoError); } return(YanesdkResult.FileReadError); } else { return(YanesdkResult.FileNotFound); } }
private bool loaded; // テクスチャーを読み込んでいるか /// <summary> /// テクスチャーの解放 /// loadで読み込んだ画像を解放する。 /// </summary> public void Release() { sizeX = sizeY = sizeRX = sizeRY = 0; widthRate = heightRate = 0; alpha = false; if (loaded) { unsafe { uint n = textureName; if (n != 0) // 読み込み途中で失敗した場合0ということもありえる。 { Gl.glDeleteTextures(1, (IntPtr)(&n)); } loaded = false; fileName = null; } } // リソースサイズが変更になったことをcache systemに通知する CacheSystem.OnResourceChanged(this); constructInfo = null; }
public async Task <ActionResult> EditActiveDirectoryUser(UserDetail userDetail) { if (ModelState.IsValid) { ViewBag.SystemAdmin = false; var identity = (System.Security.Claims.ClaimsIdentity)User.Identity; var claims = identity.Claims; string SystemAdmin = claims.FirstOrDefault(x => x.Type == "SystemAdmin")?.Value; if (SystemAdmin == "True") { ViewBag.SystemAdmin = true; } var token = GetToken(); userDetail.Roles = new List <RoleDetail>(); if (userDetail.RoleIds == null) { var message = "Must select at least one role for user."; throw new InvalidOperationException(message); } if (userDetail.RoleIds.Count > 0) { var userRoles = new List <RoleDetail>(); foreach (var id in userDetail.RoleIds) { var roles = await IzendaUtilities.GetRoles(token); var roleId = roles.FirstOrDefault(i => i.Id == Guid.Parse(id)).Id.ToString(); var role = roles.Where(i => i.Id == Guid.Parse(roleId)).Select(v => new RoleDetail { Id = v.Id, Name = v.Name }).FirstOrDefault(); if (roleId != null) { try { userDetail.Roles.Add(role); userRoles.Add(role); } catch (Exception e) { Console.WriteLine(e); throw; } } } var allRoles = await IzendaUtilities.GetRoles(token); var rolesToRemove = allRoles.Except(userRoles); foreach (var role in rolesToRemove) { try { userDetail.Roles.Remove(role); } catch (Exception e) { Console.WriteLine(e); throw; } } } try { var success = false; var izendaUsers = new List <UserDetail>(); izendaUsers = await IzendaUtilities.IzendaGetAllUsers(token); var currentUser = izendaUsers.FirstOrDefault(x => x.EmailAddress == userDetail.EmailAddress); if (currentUser == null) { success = await IzendaUtilities.SaveIzendaUser(token, userDetail); if (success) { var combinedList = CacheSystem.GetCacheItem("combinedList") as List <UserDetail>; var duplicateUserDetail = combinedList.FirstOrDefault(e => e.EmailAddress == userDetail.EmailAddress); combinedList.Remove(duplicateUserDetail); combinedList.Add(userDetail); return(PartialView("ActiveDirectoryList", combinedList)); } } if (currentUser != null && currentUser.Active != userDetail.Active) { if (currentUser.Active && !userDetail.Active) { currentUser = await IzendaUtilities.DeactivateIzendaUser(token, userDetail); } if (!currentUser.Active && userDetail.Active) { currentUser = await IzendaUtilities.ActivateIzendaUser(token, userDetail); } if (currentUser.Active == userDetail.Active) { success = await IzendaUtilities.SaveIzendaUser(token, currentUser); } } if (currentUser.Active == userDetail.Active) { success = await IzendaUtilities.SaveIzendaUser(token, currentUser); } if (success) { var combinedList = CacheSystem.GetCacheItem("combinedList") as List <UserDetail>; var duplicateUserDetail = combinedList.FirstOrDefault(e => e.EmailAddress == userDetail.EmailAddress); combinedList.Remove(duplicateUserDetail); combinedList.Add(userDetail); return(PartialView("ActiveDirectoryList", combinedList)); } } catch (Exception e) { Console.WriteLine(e); throw; } return(View(userDetail)); } else { ViewBag.SystemAdmin = false; var identity = (System.Security.Claims.ClaimsIdentity)User.Identity; var claims = identity.Claims; string SystemAdmin = claims.FirstOrDefault(x => x.Type == "SystemAdmin")?.Value; if (SystemAdmin == "True") { ViewBag.SystemAdmin = true; } var token = GetToken(); var roles = await IzendaUtilities.GetRoles(token); var employeeList = CacheSystem.GetCacheItem("combinedList") as List <UserDetail>; var employee = (from e in employeeList where e.EmailAddress == userDetail.EmailAddress select e).FirstOrDefault(); var userRoles = roles.Where(t => t.Users.Contains(employee)).ToList(); var userRolesIds = new string[userRoles.Count]; var length = userRoles.Count; for (var i = 0; i < length; i++) { userRolesIds[i] = userRoles[i].Id.ToString(); } var rolesList = new MultiSelectList(roles.ToList().OrderBy(i => i.Name), "Id", "Name", userRolesIds); employee.RoleOptions = rolesList; return(View(employee)); } }