#c# #asp.net #composite
#c# #asp.net #составной
Вопрос:
Я создал составной элемент управления. В нем нет ошибки сборки.
В составном элементе управления я использую объект Entity Framework
Проблема в том, что в окне разработки я получаю сообщение об ошибке, как показано на рис:
Во время сборки ошибки нет, и составной элемент управления работает хорошо.
Я просто хочу удалить эту ошибку из окна времени разработки
Редактировать:
Это похоже на то, как я добавляю составной элемент управления:
<tr>
<td colspan="3">
<cc1:AdditionalColumnsCustomControl ID="AdditionalColumnsCustomControl1" runat="server"
MainCssClass="A" ControlMode="New" TableID="1" AreValidatorsStatic="true"
CustomControlWrapper="TableWrapper" ValidationGroup="vl" />
</td>
</tr>
В этом случае, как я могу написать код, чтобы избавиться от этой ошибки поверхности проектирования.
Исходный код составного элемента управления:
public class AddRowCustomControl : CompositeControl
{
public void Clear()
{
Control c = (Control)FindControl(controlID);
if (c.GetType() == typeof(DropDownList))
{
DropDownList dl = c as DropDownList;
ListItem lsa = dl.SelectedItem;
lsa.Selected = false;
}
else if (c.GetType() == typeof(ListBox))
{
ListBox lb = c as ListBox;
foreach (ListItem ls in lb.Items)
{
if (ls.Selected)
{
ls.Selected = false;
}
}
}
else if (c.GetType() == typeof(RadioButtonList))
{
RadioButtonList rl = c as RadioButtonList;
foreach (ListItem ls in rl.Items)
{
if (ls.Selected)
{
ls.Selected = false;
}
}
}
else if (c.GetType() == typeof(CheckBoxList))
{
CheckBoxList cl = c as CheckBoxList;
foreach (ListItem ls in cl.Items)
{
if (ls.Selected)
{
ls.Selected = false;
}
}
}
else if (c.GetType() == typeof(CheckBox))
{
CheckBox chk = c as CheckBox;
chk.Checked = false;
}
else
{
TextBox tx = c as TextBox;
tx.Text = "";
}
}
public void Rebind()
{
Control c = (Control)FindControl(controlID);
fillControl(ref c , RowID , ColumnID);
}
public string SaveControlValuesInDB()
{
using (ExtEntities context = new ExtEntities())
{
if (RowID != null amp;amp; ColumnID != null)
{
EntityData ed = context.EntityDatas.Where(p => p.ColID == ColumnID amp;amp; p.RowID == RowID).FirstOrDefault();
if (ed == null)
{
ed = new EntityData();
ed.RowID = Convert.ToInt32(RowID);
ed.ColID = ColumnID;
ed.ColValue = ControlValue;
context.AddToEntityDatas(ed);
context.SaveChanges();
return "Successfully Added";
}
else
{
ed.ColValue = ControlValue;
context.SaveChanges();
return "Successfully Updated";
}
}
else
{
return "Exception Invalid Row ID";
}
}
}
public int? RowID
{
get;
set;
}
public enum Modes
{
New = 0,
Modify = 1,
ModifyInGrid = 2,
}
public Modes? ControlMode
{
get;
set;
}
public int ColumnID
{
get;
set;
}
public string ValidationGroup
{
get;
set;
}
/// <summary>
/// Specifes the Display mode of the Validators "Static or Dynamic"
/// </summary>
public bool? AreValidatorsStatic
{
get;
set;
}
/// <summary>
/// If true, the wrapper will be DIV's else Table
/// </summary>
public Wrapper CustomControlWrapper
{
get;
set;
}
public enum Wrapper
{
DivWrapper = 0,
TableWrapper = 1,
}
/// <summary>
/// Css Class Name for Custom Control
/// </summary>
public string MainCssClass
{
get;
set;
}
/// <summary>
/// Css Class Name for Custom Control Label
/// </summary>
public string LabelCssClass
{
get;
set;
}
/// <summary>
/// Css Class Name for Custom Control's Main Control
/// </summary>
public string ControlCssClass
{
get;
set;
}
/// <summary>
/// Css Class Name for Custom Control's Validators
/// </summary>
public string ValidatorCssClass
{
get;
set;
}
protected override void OnLoad(EventArgs e)
{
if (AreValidatorsStatic == null)
{
AreValidatorsStatic = false;
}
if (CustomControlWrapper == null)
{
CustomControlWrapper = Wrapper.DivWrapper;
}
if (string.IsNullOrEmpty(MainCssClass))
{
MainCssClass = "CustomControlMainClass";
}
if (string.IsNullOrEmpty(ControlCssClass))
{
ControlCssClass = "ControlCssClass";
}
if (string.IsNullOrEmpty(LabelCssClass))
{
LabelCssClass = "LabelCssClass";
}
if (string.IsNullOrEmpty(ValidatorCssClass))
{
ValidatorCssClass = "ValidatorCssClass";
}
if (ControlMode == null)
{
ControlMode = Modes.New;
}
base.OnLoad(e);
}
string controlID = "ControlID";
public string ControlValue
{
get
{
Control c = (Control)FindControl(controlID);
StringBuilder sb = new StringBuilder();
if (c.GetType() == typeof(DropDownList))
{
DropDownList dl = c as DropDownList;
sb.Append(dl.Text);
return sb.ToString();
}
else if (c.GetType() == typeof(ListBox))
{
ListBox lb = c as ListBox;
foreach (ListItem item in lb.Items)
{
if (item.Selected)
{
sb.Append(item.Text "`");
}
}
return sb.ToString().TrimEnd('`');
}
else if (c.GetType() == typeof(RadioButtonList))
{
RadioButtonList rl = c as RadioButtonList;
sb.Append(rl.SelectedItem.Value);
return sb.ToString();
}
else if (c.GetType() == typeof(CheckBoxList))
{
CheckBoxList cl = c as CheckBoxList;
foreach (ListItem li in cl.Items)
{
if (li.Selected == true)
{
sb.Append(li.Text "`");
}
}
return sb.ToString().TrimEnd('`');
}
else if (c.GetType() == typeof(CheckBox))
{
CheckBox chk = c as CheckBox;
return chk.Checked ? "TRUE" : "";
}
else
{
TextBox tx = c as TextBox;
return tx.Text;
}
}
}
private void AddOptions(string[] options, ref Control c)
{
if (c.GetType() == typeof(DropDownList))
{
DropDownList dl = c as DropDownList;
foreach (string item in options)
{
dl.Items.Add(item);
}
c = dl;
}
else if (c.GetType() == typeof(ListBox))
{
ListBox lb = c as ListBox;
foreach (string item in options)
{
lb.Items.Add(item);
}
c = lb;
}
else if (c.GetType() == typeof(RadioButtonList))
{
RadioButtonList rl = c as RadioButtonList;
foreach (string item in options)
{
rl.Items.Add(item);
}
c = rl;
}
else if (c.GetType() == typeof(CheckBoxList))
{
CheckBoxList cl = c as CheckBoxList;
foreach (string item in options)
{
cl.Items.Add(item);
}
c = cl;
}
}
protected override void CreateChildControls()
{
string ts = MainCssClass;
using (ExtEntities context = new ExtEntities())
{
EntityAttribute _Attribute = context.EntityAttributes.Where(p => p.ID == ColumnID).FirstOrDefault();
if (_Attribute != null)
{
Panel pnl = new Panel();
string[] _options = null;
if (_Attribute.ControlOptions != null)
{
_options = _Attribute.ControlOptions.Split('`');
}
Label lt = new Label();
lt.ID = "LabelID";
lt.Text = _Attribute.ColumnLabel;
Control c = null;
int? MaxLength = _Attribute.MaxLength;
bool Invalidate_Validator = false;
switch (_Attribute.AttributeTypeID)
{
case 1:
TextBox sl = new TextBox();
if (_Attribute.MaxLength != null)
sl.MaxLength = Convert.ToInt32(_Attribute.MaxLength);
c = sl;
break;
case 2:
TextBox ml = new TextBox();
ml.TextMode = TextBoxMode.MultiLine;
if (_Attribute.MaxLength != null)
ml.MaxLength = Convert.ToInt32(_Attribute.MaxLength);
c = ml;
break;
case 3:
DropDownList dl = new DropDownList();
c = dl;
break;
case 4:
ListBox lb = new ListBox();
lb.SelectionMode = ListSelectionMode.Multiple;
c = lb;
break;
case 5:
TextBox p = new TextBox();
p.TextMode = TextBoxMode.Password;
if (_Attribute.MaxLength != null)
p.MaxLength = Convert.ToInt32(_Attribute.MaxLength);
c = p;
break;
case 6:
CheckBox ck = new CheckBox();
Invalidate_Validator = true;
ck.Text = _options != null ? _options[0] : "N/A";
c = ck;
break;
//case 7:
// RadioButton rb = new RadioButton();
// rb.Text = _options != null ? _options[0] : "N/A";
// c = rb;
// break;
case 8:
RadioButtonList rb_list = new RadioButtonList();
c = rb_list;
break;
case 9:
CheckBoxList ck_list = new CheckBoxList();
Invalidate_Validator = true;
c = ck_list;
break;
default:
break;
}
RequiredFieldValidator req = null;
RegularExpressionValidator regx = null;
AddOptions(_options, ref c);
c.ID = controlID;
if (!Invalidate_Validator)
{
if (_Attribute.Mandatory)
{
req = new RequiredFieldValidator();
req.ControlToValidate = c.ID;
req.ErrorMessage = _Attribute.ValidationMessage;
req.Text = "*";
req.Display = AreValidatorsStatic == true ? ValidatorDisplay.Static : ValidatorDisplay.Dynamic;
req.ValidationGroup = ValidationGroup;
}
if (_Attribute.RegularExpressionValue != null)
{
regx = new RegularExpressionValidator();
regx.ControlToValidate = c.ID;
regx.ErrorMessage = _Attribute.ValidationMessage;
regx.Text = "*";
regx.ValidationGroup = ValidationGroup;
regx.ValidationExpression = _Attribute.RegularExpressionValue;
regx.Display = AreValidatorsStatic == true ? ValidatorDisplay.Static : ValidatorDisplay.Dynamic;
}
}
if (ControlMode == Modes.Modify)
{
fillControl(ref c, RowID, ColumnID);
}
if (CustomControlWrapper == Wrapper.DivWrapper)
{
pnl.Controls.Add(new LiteralControl(@"<div class=""" MainCssClass @"""><div class=""" LabelCssClass @""">"));
if (ControlMode != Modes.ModifyInGrid)
pnl.Controls.Add(lt);
pnl.Controls.Add(new LiteralControl(@"</div><div class=""" ControlCssClass @""">"));
pnl.Controls.Add(c);
pnl.Controls.Add(new LiteralControl(@"</div><div class=""" ValidatorCssClass @""">"));
if (req != null)
pnl.Controls.Add(req);
if (regx != null)
pnl.Controls.Add(regx);
pnl.Controls.Add(new LiteralControl(@"</div>"));
pnl.Controls.Add(new LiteralControl(@"</div>"));
}
else
{
pnl.Controls.Add(new LiteralControl(@"<table class=""" MainCssClass @"""><tr><td class=""" LabelCssClass @""">"));
if (ControlMode != Modes.ModifyInGrid)
pnl.Controls.Add(lt);
pnl.Controls.Add(new LiteralControl(@"</td><td class=""" ControlCssClass @""">"));
pnl.Controls.Add(c);
pnl.Controls.Add(new LiteralControl(@"</td><td class=""" ValidatorCssClass @""">"));
if (req != null)
pnl.Controls.Add(req);
if (regx != null)
pnl.Controls.Add(regx);
pnl.Controls.Add(new LiteralControl(@"</td></tr>"));
pnl.Controls.Add(new LiteralControl(@"</table>"));
}
Controls.Add(pnl);
}
}
}
private void fillControl(ref Control c, int? RowID, int ColumnID)
{
using (ExtEntities context = new ExtEntities())
{
EntityData obj = context.EntityDatas.Where(p => p.RowID == RowID amp;amp; p.ColID == ColumnID).FirstOrDefault();
if (obj != null)
{
string[] values = obj.ColValue.Split('`');
string value = obj.ColValue;
if (c.GetType() == typeof(DropDownList))
{
DropDownList dl = c as DropDownList;
dl.Items.FindByText(value).Selected = true;
}
else if (c.GetType() == typeof(ListBox))
{
ListBox lb = c as ListBox;
foreach (var item in values)
{
lb.Items.FindByText(value).Selected = true;
}
}
else if (c.GetType() == typeof(RadioButtonList))
{
RadioButtonList rl = c as RadioButtonList;
foreach (var item in values)
{
rl.Items.FindByText(item).Selected = true;
}
}
else if (c.GetType() == typeof(CheckBoxList))
{
CheckBoxList cl = c as CheckBoxList;
foreach (var item in values)
{
cl.Items.FindByText(value).Selected = true;
}
}
else if (c.GetType() == typeof(CheckBox))
{
CheckBox chk = c as CheckBox;
chk.Checked = value == "TRUE" ? true : false;
}
else
{
TextBox tx = c as TextBox;
tx.Text = value;
}
}
}
}
Спасибо
Приветствуется любая помощь.
Ответ №1:
Это связано с тем, что во время разработки объекты EF не будут доступны / созданы экземпляры. Можно проверить, отображается ли ваш элемент управления в данный момент на поверхности конструктора с помощью DesignMode
свойства (MSDN doc):
if(this.DesignMode == false)
{
//do normal instantiations of objects etc.
}
else
{
//do work related to creating a design time view of your control
}
Комментарии:
1. @Juri Ок, спасибо, на самом деле я не знаю, что объекты EF недоступны во время разработки. Куда я должен поместить этот код. Я думаю, мне это не нужно, потому что мои элементы управления отлично работают в запущенном приложении, я просто хочу избавиться от этого сообщения в моем ОКНЕ РАЗРАБОТКИ, что невозможно, не так ли, как вы сказали.
2. @KamalDeepSingh Вам именно этот код нужен, чтобы избавиться от этого сообщения. Вы должны включать ее при использовании / создании экземпляров объектов, которые потенциально недоступны во время разработки. Примером этого являются параметры
HttpContext
илиQueryString
, а также объекты, связанные с EF, я полагаю.3. @Juri я добавляю элемент управления не из кода, а просто перетаскивая его. в этом случае, как я могу написать код, чтобы избавиться от этой ошибки поверхности ПРОЕКТИРОВАНИЯ. Пожалуйста, ознакомьтесь с отредактированным вопросом
4. Насколько я понял, вы закодировали этот серверный элемент управления, верно? Итак, вам нужно изменить исходный код этого, добавив проверки для
DesignMode
.5. @Jui Я добавил исходный код, теперь, пожалуйста, укажите, что я могу сделать
Ответ №2:
Похоже, у вас есть зависимость, которую разработчик не может разрешить. Вы можете использовать флаг DesignMode, чтобы помочь с этим:http://msdn.microsoft.com/en-us/library/system.componentmodel.component.designmode.aspx
Комментарии:
1. извините, я не понимаю, что мне делать в этом случае, в статье msdn просто показан атрибут и как это должно помочь мне избавиться от этой ошибки времени разработки. что я должен закодировать. пожалуйста, укажите
2. я добавляю элемент управления не из кода, а просто перетаскивая его. в этом случае, как я могу написать код, чтобы избавиться от этой ошибки поверхности ПРОЕКТИРОВАНИЯ
3. Вы можете использовать это везде, где вы используете entity в своем элементе управления. Итак, для вашего метода ‘fillControl’ вы можете поместить: if(DesignMode){ //Заполнить демонстрационными данными … return} в начале, чтобы он не пытался использовать какую-либо базу данных.
4. Хорошо, моя проблема решена, но спасибо, на самом деле я раньше ничего не знал о designmode