Yes you can. It will take a little code and a pipeline change, but you can find the code for mvc here and webforms here.
What you want to do it count the number of times a rendering has been put on the page and stop it if it passes your max number.
public class PerformRendering : Sitecore.Mvc.Pipelines.Response.RenderPlaceholder.PerformRendering
{
protected override IEnumerable<Rendering> GetRenderings(string placeholderName, RenderPlaceholderArgs args)
{
// get all renderings
var renderings = base.GetRenderings(placeholderName, args);
// return all renderings in Experience Editor
if (Sitecore.Context.PageMode.IsExperienceEditor) return renderings;
// get the maximum number of components
var maxComponents = this.GetMaxComponents(args);
// return only first n components
return maxComponents > 0 ? renderings.Take(maxComponents) : renderings;
}
private int GetMaxComponents(RenderPlaceholderArgs args)
{
var maxComponents = 0;
if (args.CustomData.ContainsKey("maxComponents"))
{
int.TryParse(args.CustomData["maxComponents"].ToString(), out maxComponents);
}
return maxComponents;
}
}
The config change
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
<sitecore>
<pipelines>
<mvc.renderPlaceholder>
<processor patch:instead="*[@type='Sitecore.Mvc.Pipelines.Response.RenderPlaceholder.PerformRendering, Sitecore.Mvc']"
type="Website.Pipelines.RenderPlaceholder.PerformRendering, Website" />
</mvc.renderPlaceholder>
</pipelines>
<sitecore>
</configuration>