Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 2

10
votes
answers
108 views
+10

如果为空则不要添加到列表c#[保留]

我正在尝试从匿名函数创建一个列表。如果请求模型属性不为null,我希望创建列表。目前,它正在向列表添加null

代码

  public void方法(RequestModel请求){var create = new DtoModel {docs = new List< docsModel> {request.FirstDoc!= null?runFunction(request.FirstDoc):null,request.SecondDoc!= null?runFunction(request.SecondDoc):null,request.ThirdDoc!= null?runFunction(request.ThirdDoc):null,}}; }   

目前,即使任何文档为null,它也会创建一个计数列表3。我将列出仅在docs不为null且列表应仅包含非null的文档时才创建。不应该有任何空值。请求模型可以包含x个文档。

我知道我之后可以使用Linq删除空值,但我正在寻找一个解决方案,它不会在列表中创建空元素。

沙发
+100

基本上你不能用集合初始化器 - 集合初始化器总是添加与逗号分隔列表中的条目相同数量的元素。(我想你可以有一个 Add 方法忽略空值的集合,但 Add 肯定会被调用相同的次数。)

,只需使用 if 语句:

  if(request.FirstDoc!= null){create.docs.Add(runFunction(request.FirstDoc)); } // etc   

您总是可以使用本地方法来简化:

  public void method(RequestModel request){var create = new DtoModel { docs = new List< docsModel>()}; MaybeAdd(request.FirstDoc); MaybeAdd(request.SecondDoc); MaybeAdd(request.ThirdDoc); void MaybeAdd(docsModel doc){if(doc!= null){create.docs.Add(runFunction(doc)); }}   

如果一切都为null,我最初错过了关于列表本身未被初始化的部分。为此,您需要更改它以在每次添加时检查初始化:

  public void method(RequestModel request){var create = new DtoModel() ; MaybeAdd(request.FirstDoc); MaybeAdd(request.SecondDoc); MaybeAdd(request.ThirdDoc); void MaybeAdd(docsModel doc){if(doc!= null){if(create。)docs == null){create.docs = new List< docsModel>(); } create.docs.Add(runFunction(doc));   

顺便说一句,我强烈建议您开始遵循正常的.NET命名约定,使用PascalCase来处理类型和属性( DocsModel Method RunFunction Docs )。

另外,我想(谦卑地)向OP推荐他/她检查三元运算符的工作原理docs.microsoft.com/en-us/dotnet/csharp/language-reference/ - burkay 8月30日22:46

@burkay:我没有看到他们不知道条件运算符的作用。我不认为这是令他们困惑的部分。 - Jon Skeet 8月31日5:50

板凳
-10

使用Linq

您可以使用一点LINQ完成您想要的任务。

  var create = new DtoModel {docs =(new [] {request.FirstDoc,request.SecondDoc,request.ThirdDoc})。Where(d => d!= null)。选择(d => runFunction(d))。ToList()};   

更长但更容易阅读

这有点难以阅读,所以我建议将其分解一下。

创建一个辅助方法将请求展开到数组中:

  static public T [] CreateArray< T>(params T [] input){return input; }   

然后以这种方式编写:

  var requests = CreateArray(request.FirstDoc,request.SecondDoc,request.ThirdDoc); var processedRequests = requests.Where(r => r!= null).Select(r => runFunction(r)); var create = new DtoModel {docs = processedRequests.ToList()};   

或者如果你喜欢使用三元运算符,就像在你的例子中一样,你可以这样做:

  public void method(RequestModel request){ var create = new DtoModel {docs = CreateArray(request.FirstDoc!= null?runFunction(request.FirstDoc):null,request.SecondDoc!= null?runFunction(request.SecondDoc):null,request.ThirdDoc!= null?runFunction (request.ThirdDoc):null,}。Where(d => d!= null).ToList()};
     
			
        

OP表示不使用linq。我同意他的看法。要构造一个包含空值的列表,然后构造另一个带有空值的过滤器,那么从一开始就以正确的方式构造它就没有意义了。 - 丹尼尔施密德8月31日7:28

仔细读。我相信他不想使用linq“之后删除空值”,即希望魔法在集合初始化器中发生。我认为我的代码确实如此。 - John Wu 8月31日7:30

在上一个示例中,您创建一个数组,然后过滤空值(Where(...)),然后从中创建一个List。这就是代码的作用 - Daniel Schmid 8月31日7:39

什么清单?我没有看到任何清单。我看到一个IEnumerable。列表创建一次,使用ToList(),具有正确数量的元素......全部在集合初始值设定项中。 - John Wu 8月31日7:40

10
votes
answers
24 views
+10

为什么LINQ中的LastOrDefault(谓词)比FirstOrDefault(谓词)更快

简介

在测试当前某些LinQ函数的性能差异时,我注意到, LastOrDefault(谓词)几乎总是比 FirstOrDefault(谓词),这让我有点兴趣,所以我写了一些测试用例,以测试彼此的两个函数。

我创建了一个从1到1的 integer 值列表像这样的:

  List< int> l = new List< int>(); for(int i = 1; i< = 1000000; i ++){l.Add(i); }   

然后写了2个方法 first() last()

  static void first(List< int> l){int e = l。FirstOrDefault(x => x == 500000); int z = l.FirstOrDefault(x => x == 500000); int d = l.FirstOrDefault(x => x == 500000); int v = l.FirstOrDefault(x => x == 500000); int f = l.FirstOrDefault(x => x == 500000); }   

我在for循环中运行1000次,在最后一次迭代后设置一个条件停止的断点,但是在我测试的每个单例中, LastOrDefault 更快。

测试用例
  • 两者都设置为列表中间的元素( LastOrDefault 几乎快两倍)
  • 两者都设置为列表中具有相同距离的元素(如250k和750k) - 再次 LastOrDefault 更快
  • Console.WriteLine(DateTime.Now +“:”+ DateTime.Now.Millisecond); for(int i = 0; i< 1000; i ++){first(l); Console.WriteLine(DateTime.Now +“:”+ DateTime.Now.Millisecond); for(int i = 0; i< 1000; i ++){last(l); Console.WriteLine(DateTime.Now +“:”+ DateTime.Now.Millisecond);

    FirstOrDefault 也返回34秒, LastOrDefault

    问题

    为什么 LastOrDefault <

up vote 10 down vote accepted favorite
沙发
+100
+50

steve16351 在已删除的评论中指出,在.NET Core中, Last 具有以下优化:

  if(source is IList&lt; TSource&gt; list){for(int i = list.Count  -  1; i&gt; = 0; --i){TSource result = list [i ]。if(谓词(结果)){found = true; 返回结果; }   

第一个 没有并且最终运行:

  foreach(源代码中的TSource元素){if(predicate(element)){found = true; 返回元素;   

索引器对列表元素的访问很可能比使用 foreach 和迭代器更快。相比之下,.NET Standard没有对 最后 ,而不是遍历完整的输入,而 Last 的运行速度比 First 的运行速度慢。 没有并最终运行:

  foreach(源代码中的TSource元素){if(predicate(element)){found = true; 返回元素;   

索引器对列表元素的访问很可能比使用 foreach 和迭代器更快。相比之下,.NET Standard没有对 最后 ,而不是遍历完整的输入,而 Last 的运行速度比 First 的运行速度慢。 没有并最终运行:

  foreach(源代码中的TSource元素){if(predicate(element)){found = true; 返回元素;   

索引器对列表元素的访问很可能比使用 foreach 和迭代器更快。相比之下,.NET Standard没有对 最后 ,而不是遍历完整的输入,而 Last 的运行速度比 First 的运行速度慢。 foreach(源代码中的TSource元素){if(predicate(element)){found = true; 返回元素;

索引器对列表元素的访问很可能比使用 foreach 和迭代器更快。相比之下,.NET Standard没有对 最后 ,而不是遍历完整的输入,而 Last 的运行速度比 First 的运行速度慢。 foreach(源代码中的TSource元素){if(predicate(element)){found = true; 返回元素;

索引器对列表元素的访问很可能比使用 foreach 和迭代器更快。相比之下,.NET Standard没有对 最后 ,而不是遍历完整的输入,而 Last 的运行速度比 First 的运行速度慢。 索引器对列表元素的访问很可能比使用 foreach 和迭代器更快。相比之下,.NET Standard没有对 最后 ,而不是遍历完整的输入,而 Last 的运行速度比 First 的运行速度慢。 索引器对列表元素的访问很可能比使用 foreach 和迭代器更快。相比之下,.NET Standard没有对 最后 ,而不是遍历完整的输入,而 Last 的运行速度比 First 的运行速度慢。

0

我尝试执行 ExecuteFirst ExecuteLast ,甚至改变执行顺序, LastOrDefault 总是超过 FirstOrDefault

  class Program {static void Main(string [] args){List&lt; int&gt; numbers = new List&lt; int&gt;(); for(int i = 1; i&lt; = 1000000; i ++){numbers.Add(i); } for(int i = 1; i&lt; = 100; i ++){秒表秒表=新秒表(); ExecuteFirst(ref秒表,参考编号); stopwatch.Reset(); ExecuteLast(ref秒表,参考编号); } for(int i = 1; i&lt; = 100; i ++){秒表秒表=新秒表(); ExecuteLast(ref秒表,参考编号); stopwatch.Reset(); ExecuteFirst(ref秒表,参考编号); private static void ExecuteFirst(ref秒表秒表,ref List&lt; int&gt;数字){stopwatch.Start(); int first = numbers.FirstOrDefault(x =&gt; x == 500000); stopwatch.Stop(); Console.WriteLine(“First:”+ stopwatch.Elapsed); } private static void ExecuteLast(ref秒表秒表,ref List&lt; int&gt;数字){stopwatch.Start(); int last = numbers.LastOrDefault(x =&gt; x == 500000); stopwatch.Stop(); Console.WriteLine(“Last:”+ stopwatch.Elapsed); }   

13
votes
answers
32 views
+10

.Net Framework dll无法处理.Net标准项目

我已将 .Net framework ddl引用到 .Net standard 2.0 它将向我显示以下错误。

  System.Reflection.ReflectionTypeLoadException:'无法加载一个或多个请求的类型。给定的程序集名称或代码库'?inDebug etcoreapp2.1FirstDataBank.DrugServer.API.dll'无效。给定的程序集名称或代码库'?inDebug etcoreapp2.1FirstDataBank.DrugServer.API.dll'无效。给定的程序集名称或代码库'?inDebug etcoreapp2.1FirstDataBank.DrugServer.API.dll'无效。给定的程序集名称或代码库'?inDebug etcoreapp2.1FirstDataBank.DrugServer.API.dll'无效。  

相同的ddl工作正常。

沙发
+60
+50

“.Net Framework dll无法处理.Net标准项目” - 嗯,是的; 这是正常的和预期的; 如果您需要使用仅适用于.NET Framework (而不是.NET Standard)的内容,那么:您应该只从一个本身就是.NET Framework的项目中使用它; 或者:考虑重新定位或多目标定位您正在使用的库(如果您控制它;否则:询问供应商),理想情况下,它可以作为针对.NET Standard或多目标的nupkg使用.NET Framework .NET标准。

+70

这根本不受支持。

您可以从.NET Framework项目中引用一些(但不是全部).NET标准库,但不支持其他方式。 < p> .NET Standard旨在支持不同平台之间的代码共享,但.NET Framework仅支持Windows。

为了帮助您开始讨论该主题,这里有一个很好的帖子,它解释得非常简短:< a href =“https://social.msdn.microsoft.com/Forums/vstudio/en-US/7035edc6-97fc-49ee-8eee-2fa4d040a63b/what-are-differences-between-net-framwork-net-standard- and-net-core?forum = clr“rel =”nofollow noreferrer“>标准,框架和核心之间的差异

@MarcGravell thx澄清,我会调整答案 - Michael Sander 8月28日9:31

0
votes
answers
70 views
+10

Microsoft.DotNet.Props目錄不存在,用於構建xproj

0

我們正在嘗試構建xproj項目以及有關無法找到Microsoft.DotNet.Props文件的錯誤,因爲它看起來像是在查看錯誤的目錄。Microsoft.DotNet.Props目錄不存在,用於構建xproj

考慮看看MSBuildExtensionsPath32引用C:Program Filesdotnetsdk1.1.4所在目錄MicrosoftVisualStudio..不存在XML ...但正常的MSBuild目錄C:Program Files (x86)MSBuild確實有Microsoft.DotNet.Props文件的目錄C:Program Files (x86)MSBuildMicrosoftVisualStudiov14.0DotNetMicrosoft.DotNet.Props

下面是部分在XML

<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)MicrosoftVisualStudiov$(VisualStudioVersion)</VSToolsPath> 

<Import Project="$(VSToolsPath)DotNetMicrosoft.DotNet.Props" Condition="'$(VSToolsPath)' != ''" /> 

我看,而建築是錯誤:

error MSB4019: The imported project "C:Program Filesdotnetsdk1.1.4MicrosoftVisualStudiov14.0DotNetMicrosoft.DotNet.Props" was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk. 

如果任何人有任何想法發生了什麼事,幫助將是巨大

編輯:

  • 構建從詹金斯項目調用Windows Server 2012中R2上。
  • VM映像來自Azure市場「MicrosoftVisualStudio/VisualStudio/VS-2015-Comm-VSU3-AzureSDK-29-WS2012R2/2017.10.12」 - 隨Visual Studio 2015社區版附帶更新3一起提供。 Azure SDK 2.9。從舊v0.12升級到v8.x.升級的.NET核心不知道什麼是安裝到1.1.4。
  • xproj本身沒有代碼 - 除了Startup.cs中用於提供靜態文件(代碼位於底部的代碼)的少量代碼外。
  • 該應用程序還用於Service Fabric項目。這個錯誤並不是來自構建.sln,而是在打包.sfproj(它可能不是構建在sln中,但打包需要構建它)。

Jenkins build steps

Startup.cs:

using System.IO; 
using Microsoft.AspNetCore.Builder; 
using Microsoft.AspNetCore.Hosting; 
using Microsoft.Extensions.Configuration; 
using Microsoft.Extensions.DependencyInjection; 
using Microsoft.Extensions.Logging; 

namespace Website 
{ 
    public class Startup 
    { 
     public Startup(IHostingEnvironment env) 
     { 
      var builder = new ConfigurationBuilder() 
       .SetBasePath(env.ContentRootPath) 
       .AddJsonFile("appsettings.json", true, true) 
       .AddJsonFile($"appsettings.{env.EnvironmentName}.json", true) 
       .AddEnvironmentVariables(); 
      Configuration = builder.Build(); 
     } 

     public IConfigurationRoot Configuration { get; } 

     // This method gets called by the runtime. Use this method to add services to the container. 
     public void ConfigureServices(IServiceCollection services) 
     { 
      // Add framework services. 
      services.AddMvc(); 
     } 

     // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. 
     public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
     { 
      loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
      loggerFactory.AddDebug(); 

      if (env.IsDevelopment()) 
      { 
       app.UseDeveloperExceptionPage(); 
      } 
      else 
      { 
       app.UseExceptionHandler("/Home/Error"); 
      } 

      app.Use(async (context, next) => 
      { 
       await next(); 
       if (context.Response.StatusCode == 404 
        && !Path.HasExtension(context.Request.Path.Value)) 
       { 
        context.Request.Path = "/index.html"; 
        await next(); 
       } 
      }); 

      app.UseStaticFiles(); 
     } 
    } 
} 

編輯:這裏是整個xproj XML

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion> 
    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)MicrosoftVisualStudiov$(VisualStudioVersion)</VSToolsPath> 
    </PropertyGroup> 
    <Import Project="$(VSToolsPath)DotNetMicrosoft.DotNet.Props" Condition="'$(VSToolsPath)' != ''" /> 
    <PropertyGroup Label="Globals"> 
    <TypeScriptCompileBlocked>true</TypeScriptCompileBlocked> 
    <ProjectGuid>17107df8-0cfa-6946-917a-a9b8765cf9ea</ProjectGuid> 
    <RootNamespace>Website</RootNamespace> 
    <BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">.obj</BaseIntermediateOutputPath> 
    <OutputPath Condition="'$(OutputPath)'=='' ">.in</OutputPath> 
    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion> 
    </PropertyGroup> 
    <PropertyGroup> 
    <SchemaVersion>2.0</SchemaVersion> 
    <IsServiceFabricServiceProject>True</IsServiceFabricServiceProject> 
    </PropertyGroup> 
    <ItemGroup> 
    <DnxInvisibleContent Include="bower.json" /> 
    <DnxInvisibleContent Include=".bowerrc" /> 
    </ItemGroup> 
    <ItemGroup> 
    <DnxInvisibleFolder Include="wwwrootAngulardist" /> 
    </ItemGroup> 
    <ItemGroup> 
    <Service Include="{82a7f48d-3b69-4b1e-b82e-3ada8210c987}" /> 
    </ItemGroup> 
    <Import Project="$(VSToolsPath)DotNet.WebMicrosoft.DotNet.Web.targets" Condition="'$(VSToolsPath)' != ''" /> 
</Project> 
+0

問題沒有足夠的信息來重現錯誤。你能發佈最少的代碼,這將允許重現你的問題,此外請提供關於如何構建被調用,平臺,安裝sdks,VS等信息。 –

+0

@JacekBlaszczynski我已經更新了原來的帖子 – Jjj

+0

感謝發佈代碼。你可以發佈整個項目的XML和pkgproj或任何相當於什麼可以用來建立你的項目?有時調試msbuild項目是非常困難和不重要的,尤其是當錯誤埋藏得很深並且缺少信息錯誤信息時。我要去睡了,所以明天會回答:) –

沙发
0
1

您正在嘗試使用預覽工具(xproj)與.NET Core Sdk的1.1.4版本。 VS 2015中提供的預覽工具不適用於.NET Core的1.0+穩定工具。

請確保您的開發機器和Jenkins服務器上都安裝了.NET Core SDK的preview2版本 - 例如, 1.0.0-preview2-003156 - 這一個global.json文件存在於您的解決方案目錄告訴VS使用SDK的這個預覽版本:

{ 
    "sdk": { 
    "version": "1.0.0-preview2-003156" 
    } 
} 

正如我建議通過遷移移動到穩定和支持.NET的核心工具一個長期的解決方案到VS 2017.

0
votes
answers
39 views
+10

我怎麼能比較和SEACH字符串和日期時間C#

1

我創建像比較兩個字符串一個簡單的搜索:我怎麼能比較和SEACH字符串和日期時間C#

articles = _service.ArticleRepository.GetAll(id, new Expression<Func<Article, bool>>[] { x => x.Title.Contains(searchWord) }, a => a.ArticleCategory); 

和工程罰款;但我想在日期時間(日期)搜索,我寫不同的代碼:

articles = _service.ArticleRepository.GetAll(id, new Expression<Func<Article, bool>>[] { x => x.InsertDate ==DateTime.Parse(searchWord) }, a => a.ArticleCategory); 

articles = _service.ArticleRepository.GetAll(id, new Expression<Func<Article, bool>>[] { x => x.InsertDate.ToString("yyyyMMdd").Contains(searchWord) }, a => a.ArticleCategory); 

給我一個錯誤:

LINQ to Entities does not recognize the method 'System.DateTime Parse(System.String)' method, and this method cannot be translated into a store expression.

From this line int count = _db.Count();

我怎麼可以做一些字符串之間的比較和日期作爲一個字符串輸入日期(以不同的格式,如:2017/8/5或05/05/2017或2017-8-5或...)或甚至輸入一個數字(搜索所有日期有一個數字)?

沙发
0
2

當LINQ查詢被執行,它會得到轉換成等價的SQL語句。 DateTime.Parse是將字符串轉換爲相應的DateTime的C#方法。沒有相應的SQL等價物可以這樣做。

您需要在LINQ查詢之前創建一個DateTime對象並使用它。

var d = DateTime.Parse(searchWord); 
var result= someEntityCollection.Where(a =>a.CreatedTime==d)); 

如果CreatedTimeDateTime字段,則比較將包括時間戳以及。也就是說,它不會簡單地給記錄該日期,但日期和具體時間部分

如果你想過濾特定日期的記錄(沒有時間),你可以使用DbFunctions.TruncateTime helper方法這樣做

var d = DateTime.Parse(searchWord); 
var result= someEntityCollection.Where(a => 
      DbFunctions.TruncateTime(a.CreatedTime)== DbFunctions.TruncateTime(d.Date)) 

DbFunctions.TruncateTime助手方法內System.Data.Entity命名空間中定義。所以確保你有一個使用聲明來使用它。

using System.Data.Entity; 

而且它是安全的使用DateTime.ParseExactTryParseExact的格式,比採用DateTime.Parse

var d = DateTime.ParseExact(searchWord, "dd/MM/yyyy", CultureInfo.InvariantCulture); 
板凳
0
1

你需要做你的查詢外的轉換:

var date=DateTime.Parse(searchWord); 
articles = _service.ArticleRepository.GetAll(id, new Expression<Func<Article, bool>>[] { x => x.InsertDate ==date }, a => a.ArticleCategory); 
0
votes
answers
48 views
+10

返回列表到控制器asp.net的ajax調用

1

我想從我的控制器返回列表到AJAX調用中的成功函數。我能夠成功地從控制器返回列表,但在AJAX調用中,錯誤代碼被執行並且出現內部服務器錯誤。 我到處搜索相同的東西,但我無法找到發生這種情況的原因。返回列表到控制器asp.net的ajax調用

以下是我的AJAX:

$.ajax({ 
     type: "POST", 
     dataType: 'JSON', 
     url: "/BookUtility/GetHallsList", 
     success: function (hallsList) { 
      console.log(hallsList); 
     }, 
     error: function (xhr,status, exception) { 
      console.log("Error: " + exception + ", Status: " + status); 
     } 
    }); 

控制器:

Hall objHall = new Hall(); 
[HttpPost] 
public JsonResult GetHallsList() 
    { 
     var hallsList = objHall.GetHallsList(); 
     return Json(hallsList.ToList()); 
    } 

Hall.cs

public List<tblHall> GetHallsList() 
     { 
      List<tblHall> hallsList; 
      using (BookingSystemDBEntities db = new BookingSystemDBEntities()) 
      { 
       hallsList = db.tblHalls.ToList(); 
      } 
      return hallsList; 
     } 

我我也嘗試在我的控制器中使用List<tblHall> hallsList = objHall.GetHallsList();代替var hallsList = objHall.GetHallsList();,但這不起作用。

這是我得到的錯誤: Error I received

我要去哪裏錯了?

+0

你爲什麼要實例化Hall objHall = new Hall(); ? – Sajeetharan

+0

@Sajeetharan Hall.cs是一個模特班,我從中得到了大廳的名單。 –

+0

嘗試實例化它的方法 – Sajeetharan

沙发
0
0

正如您的錯誤所述,問題出在web api方法上。它應該拋出錯誤。 ObjectContext實例已被處置,並且不能再用於需要連接的操作。你可以通過設置來修復它

using (var contex = new BookingSystemDBEntities()) 
{ 
    context.Configuration.LazyLoadingEnabled = false; 
    hallsList = db.tblHalls.ToList(); 
} 
0
votes
answers
42 views
+10

當MetroTiles被移除時,MetroPanel滾動位置不重置

0

更新: 我沒有提及我也在使用MetroTabControl,因爲我認爲它不相關。但是,我做了更多的測試,下面是我的結果。我也會張貼這個作爲我自己問題的答案。當MetroTiles被移除時,MetroPanel滾動位置不重置

  1. MetroPanel這是造成問題的是不同的選項卡比按鈕,更新

我把不同的MetroPanel相同標籤的違規按鈕和中提琴上,該面板的工作完全正常。我繼續刪除原始的MetroPanel並在單獨的標籤頁上重新創建它。這似乎解決了問題。我不知道如何,但它在那裏。

原始文本:
情況是這樣的:

  1. MetroModernUI包由丹尼斯·馬格諾,V1.4.0安裝在一個MetroForm的 解決方案
  2. MetroPanelAutoScroll設置爲true水平處理 瓷磚
  3. MetroTiles在運行時基於給定的配置創建uration
  4. 當配置改變時,所有的瓦片被卸載並重新加載

注:我並不擔心卸載,每次重裝所有的磚的性能影響。我預計一次不會超過10個。

問題: 當水平滾動條被定位一路到面板的右側,和一個MetroTile被去除,不重置。這可以使滾動位置在實際的可滾動區域之外,就我所知。這會導致閃爍,我的MetroTiles實際上並沒有出現。我嘗試了所有我能想到的相關滾動屬性,但我不知所措。您可以在以下代碼片段中看到我正在使用AutoScrollPositionHorizontalScroll.Value來嘗試重置它,但它不會重置。

例子: 這裏是發生了什麼事的GIF: https://gyazo.com/362b83abae795f728675a3c11fcf6a29

代碼:

public void LoadTiles(MetroPanel panel) 
{ 
    foreach (Feed feed in Feeds.GetFeedsFromConfig()) 
    { 
     var tile = CreateTile(feed); 
     AddTile(panel, tile); 
    } 

} 
public void UnloadTiles(MetroPanel panel) 
{ 

    var tiles = panel.Controls.OfType<MetroTile>().ToArray(); 
    for(var i = tiles.Count()-1; i>=0; i--) 
    { 
     panel.Controls.Remove(tiles[i]); 
     tiles[i].Dispose(); 
    } 
    panel.AutoScrollPosition = new Point(0, 0); 
    panel.HorizontalScroll.Value = 0; 
} 
public void AddTile(MetroPanel panel, MetroTile tile) 
{ 
    var numTiles = panel.Controls.OfType<MetroTile>().Count(); 
    tile.Location = new Point(numTiles * 155, 0); 
    panel.Controls.Add(tile); 
} 
public MetroTile CreateTile(Feed feed) 
{ 
    MetroTile tile = new MetroTile(); 
    tile.Text = feed.Name; 
    tile.Style = MetroColorStyle.Purple; 
    tile.TileTextFontSize = MetroTileTextSize.Tall; 
    tile.UseStyleColors = true; 
    tile.Theme = MetroThemeStyle.Dark; 
    tile.Tag = feed; 
    tile.Click += new EventHandler(LoadFeedInBrowser); 
    tile.Size = new Size(150, 100); 
    return tile; 
} 
沙发
0
0

我沒有提到我也使用MetroTabControl因爲我沒有認爲這是相關的。但是,我做了更多的測試,下面是我的結果。我也會張貼這個作爲我自己問題的答案。

  1. MetroPanel這是造成問題的是不同的選項卡比按鈕,更新

我把不同的MetroPanel相同標籤的違規按鈕和中提琴上,該面板的工作完全正常。我繼續刪除原始的MetroPanel並在單獨的標籤頁上重新創建它。這似乎解決了問題。我不知道如何,但它在那裏。我唯一的猜測是,我不知何故搞砸了原來的MetroPanel

0
votes
answers
37 views
+10

如何在文本框旁邊顯示tooltil?

-1

我有一個工具提示TextBox。如何在文本框旁邊顯示tooltil?

我需要在我的文本框旁邊顯示工具提示,但怎麼做?

if (this.txtBoxName.Text == "") 

{ 
    ToolTip tip = new ToolTip(); 
    tip.IsBalloon = false; 
    tip.ToolTipTitle = ""; 
    tip.InitialDelay = 0; 
    tip.BackColor = Color.Aqua; 
    this.txtBoxName.Focus(); 
    Point point = new Point(750, 560); 
    tip.Show("Please Enter UserName", this.txtBoxName); 
} 
+0

參見:[展會上的文本框進入提示](HTTPS ://stackoverflow.com/questions/14695357/show-tooltip-on-textbox-entry)。 –

+0

你必須設置你的點x,y相對於你的文本框。 – aghilpro

+0

請爲此使用佔位符文本而不是工具提示。 –

沙发
0
1

試試這個:

if (this.txtBoxName.Text == null || this.txtBoxName.Text == "") 
{ 
    ToolTip tip = new ToolTip(); 
    tip.IsBalloon = false; 
    tip.ToolTipTitle = ""; 
    tip.InitialDelay = 0; 
    tip.BackColor = Color.Aqua; 
    this.txtBoxName.Focus(); 
    Point point = new Point(txtBoxName.Location.X - 50, txtBoxName.Location.Y - 50); // for example 50px change 
    tip.Show("Please Enter UserName", this.txtBoxName, point, 2000); // set 2000ms to auto close TooTip 
} 

我用這個Show功能overLoad,看到有關它的詳細信息:

public void Show(string text, IWin32Window window, Point point, int duration);

摘要: 設置與指定控件關聯的工具提示文本,然後>在指定的相對位置顯示指定持續時間的工具提示 。

參數

文本: 一個包含新的工具提示文本System.String。

窗口: 顯示工具提示的System.Windows.Forms.Control。

: 甲System.Drawing.Point含有的偏移量,以像素爲單位,相對於該相關聯的控制窗口的 左上角,以顯示工具提示。

持續時間:含有 一個System.Int32的持續時間,以毫秒爲單位,以顯示 工具提示。

例外

System.ArgumentNullException: 窗口參數爲null。

System.ArgumentOutOfRangeException: 持續時間小於或等於0

+0

它的工作表示感謝。 :)) – comodor16

板凳
0
1

您還可以定義一個模板文本框

<TextBox.Template> 
    <ControlTemplate> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="{TemplateBinding ToolTip}" /> 
      <TextBox Text="{TemplateBinding TextBox.Text}"></TextBox> 
     </StackPanel> 
    </ControlTemplate> 
</TextBox.Template> 
+0

這很好。謝謝 – Skyuppercut

0
votes
answers
47 views
+10

防止懸停邊框

1

當我將鼠標懸停在ToolStripMenuItem上時,即使它被禁用,也會在其周圍顯示邊框。有沒有任何財產去除這個?防止懸停邊框

我在尋找屬性,如HoverBorder,但還沒有找到任何有用的東西。

沙发
0
1

ToolStripProfessionalRenderer默認繪製邊界使用MenuItemBorder屬性ProfessionalColorTable

爲了使邊境僅用於已啓用菜單項可見,您可以創建自定義ProfessionalColorTable和定製ToolStripProfessionalRenderer,並添加新MenuItemEnabledBorder返回默認的邊框顏色,並且還覆蓋MenuItemBorder返回Color.Transparent

然後在您的自定義渲染器中,當項目爲highlighetd時,就可以覆蓋OnRenderMenuItemBackground並使用MenuItemEnabledBorder繪製邊框。

代碼

public class MyColorTable : ProfessionalColorTable 
{ 
    public override Color MenuItemBorder { get { return Color.Transparent; } } 
    public Color MenuItemEnabledBorder { get { return base.MenuItemBorder; } } 
} 

public class MyRenderer : ToolStripProfessionalRenderer 
{ 
    public MyRenderer() : base(new MyColorTable()) { } 
    protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e) 
    { 
     base.OnRenderMenuItemBackground(e); 
     if (e.Item.Enabled && e.Item.Selected) 
     { 
      using (var pen = new Pen(((MyColorTable)ColorTable).MenuItemEnabledBorder)) 
      { 
       var r = new Rectangle(2, 0, e.Item.Width - 4, e.Item.Height - 1); 
       e.Graphics.DrawRectangle(pen, r); 
      } 
     } 
    } 
} 

然後使用該渲染器,它足以把它設置爲你的工具條渲染:

this.toolStrip1.Renderer = new MyRenderer(); 

enter image description here

+0

完美的作品!還有可愛的GIF;) –

+0

不客氣;) –

板凳
0
1

您可以覆蓋ToolStripProfessionalRenderer類將你的顏色傳遞給它的基類構造函數(如果你不想讓邊界通過原始的BackColor) :

namespace WindowsFormsApplication11 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      menuStrip1.Renderer = new CustomColors(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 
    } 

    private class CustomColors : ToolStripProfessionalRenderer 
    { 
     public CustomColors() : base(new MyColors()) { } 
    } 

    private class MyColors : ProfessionalColorTable 
    { 
     public override Color MenuItemSelected 
     { 
      get { return Color.GreenYellow; } 
     } 
     public override Color MenuItemSelectedGradientBegin 
     { 
      get { return Color.DarkBlue; } 
     } 
     public override Color MenuItemSelectedGradientEnd 
     { 
      get { return Color.Yellow; } 
     } 
    } 
} 
0
votes
answers
40 views
+10

從內容頁面調用主頁面的方法Web方法

0

我在主頁面上有一個方法(非靜態),將從內容頁面Method(靜態WebMethod)調用。 如 母版頁:從內容頁面調用主頁面的方法Web方法

public partial class User : System.Web.UI.MasterPage 
{ 
public void loadcart() 
{ 
//some code here that i will a div 
} 
} 

內容頁:

public partial class Menu : System.Web.UI.Page 
{ 
[webMethod] 
public static void Order() 
{ 
// some code here 
// call Master page method from here 
} 
} 

令()(內容頁面方法)將從jQuery的AJAX和loadcar()(母版頁功能)稱爲將在Order()函數中調用。

我需要從內容頁面調用母版頁方法。請爲我提供一些解決方案。

有什麼想法嗎?

+1

[主頁面調用方法]的可能重複(https://stackoverflow.com/questions/6332889/call-method-in-master-page) – Alexander

沙发
0
0

例如,如果您想調用loadcart,您可以執行masterpage的轉換。

  (this.Master as SiteMaster).loadcart();