2013-02-08 185 views
1

我需要关于我的代码的指导。按钮单击事件不会触发并发生错误

public class FacultyTemplatedynamic:ITemplate 
{ 
    ListItemType ItemType; 
    string FieldName; 
    string InfoType; 
    private bool isEditMode = false; 
    protected bool isInEditMode 
    { 
     get { return this.isEditMode; } 
     set { this.isEditMode = value; } 
    } 
    public FacultyTemplatedynamic(ListItemType itemType, string field_name, string info_type) 
    { 
     FieldName = field_name; 
     ItemType = itemType; 
     InfoType = info_type; 
    } 

    public void InstantiateIn(Control container) 
    { 
     switch (ItemType) 
     { 
      case ListItemType.Header: 
       Literal header_litrl = new Literal(); 
       header_litrl.Text = "<b>" + FieldName + "</b>"; 
       container.Controls.Add(header_litrl); 
       break; 
      case ListItemType.Item: 
       switch (InfoType) 
       { 
        case "Command": 
         ImageButton edit_button = new ImageButton(); 
         edit_button.ID = "edit_button"; 
         edit_button.ImageUrl = "~/Images/edit.gif"; 
         edit_button.CommandName = "Edit"; 
         edit_button.ToolTip = "Edit"; 
         container.Controls.Add(edit_button); 
         break; 
        default: 
         Label field_lbl = new Label(); 
         field_lbl.ID = "labelName"; 
         //field_lbl.Visible =!(bool) isInEditMode; 
         field_lbl.Text = String.Empty; //we will bind it later through 'OnDataBinding' event 
         field_lbl.DataBinding += new EventHandler(OnDataBinding); 
         container.Controls.Add(field_lbl); 
         break; 
       } 
       break; 
      case ListItemType.EditItem: 
       if (InfoType == "Command") 
       { 
        ImageButton update_button = new ImageButton(); 
        update_button.ID = "update_button"; 
        update_button.CommandName = "Update"; 
        update_button.ImageUrl = "~/Images/update.gif"; 

        update_button.ToolTip = "Update"; 
        update_button.OnClientClick = "return confirm('Are you sure to update the record?')"; 
        container.Controls.Add(update_button); 

        ImageButton cancel_button = new ImageButton(); 
        cancel_button.ImageUrl = "~/Images/cancel.gif"; 
        cancel_button.ID = "cancel_button"; 
        cancel_button.CommandName = "Cancel"; 
        cancel_button.ToolTip = "Cancel"; 
        container.Controls.Add(cancel_button); 

       } 
       else// for other 'non-command' i.e. the key and non key fields, bind textboxes with corresponding field values 
       { 
        Label field_lbl1 = new Label(); 
        field_lbl1.ID = "LabelEdit"; 
        //field_lbl1.Visible = (bool)isInEditMode; 
        field_lbl1.Text = String.Empty; //we will bind it later through 'OnDataBinding' event 
        field_lbl1.DataBinding += new EventHandler(OnDataBinding); 
        container.Controls.Add(field_lbl1); 
       } 
       break; 
     } 
    } 

    private void OnDataBinding(object sender, EventArgs e) 
    { 
     object bound_value_obj = null; 
     Control ctrl = (Control)sender; 
     IDataItemContainer data_item_container = (IDataItemContainer)ctrl.NamingContainer; 
     bound_value_obj = DataBinder.Eval(data_item_container.DataItem, FieldName); 

     switch (ItemType) 
     { 
      case ListItemType.Item: 
       Label field_ltrl = (Label)sender; 
       field_ltrl.Text = bound_value_obj.ToString(); 

       break; 
      case ListItemType.EditItem: 
       TextBox field_txtbox = (TextBox)sender; 
       field_txtbox.Text = bound_value_obj.ToString(); 

       break; 
     } 
    } 
} 




private void CreateTemplatedGridView() 
     { 
      PopulateTable(); 
      for (int i = 0; i < dt.Columns.Count; i++) 
      { 
       TemplateField tf = new TemplateField(); 
       tf.HeaderTemplate = new FacultyTemplatedynamic(ListItemType.Header, dt.Columns[i].ColumnName, dt.Columns[i].DataType.Name); 
       tf.ItemTemplate = new FacultyTemplatedynamic(ListItemType.Item, dt.Columns[i].ColumnName, dt.Columns[i].DataType.Name); 
       tf.EditItemTemplate = new FacultyTemplatedynamic(ListItemType.EditItem, dt.Columns[i].ColumnName, dt.Columns[i].DataType.Name); 
       GrdMarkAttendance.Columns.Add(tf); 
      } 
      TemplateField tf1 = new TemplateField(); 
      GrdMarkAttendance.Columns.Add(tf1); 
      GrdMarkAttendance.DataSource = dt; 
      GrdMarkAttendance.DataBind(); 
     } 

    private void PopulateTable() 
     { 
      dt = new DataTable(); 
      dt = obj.GetRegister(); 
     }  

    protected void GrdMarkAttendance_RowDataBound(object sender, GridViewRowEventArgs e) 
     { 
      PopulateTable(); 
      int i = dt.Columns.Count;   
      if (e.Row.RowType == DataControlRowType.DataRow) 
      { 

       DropDownList ddl = new DropDownList(); 
       ddl.ID = "ddl"; 
       ddl.Items.Insert(0, "Present"); 
       ddl.Items.Insert(1, "Absent"); 
       ddl.Items.Insert(2, "Leave");    
       e.Row.Cells[i].Controls.Add(ddl); 
      } 
     }  

    protected void Button1_Click(object sender, EventArgs e) 
     { 

     } 

当我运行该页面并点击按钮,我得到了以下错误

服务器错误“/”应用。

找到具有相同ID'labelName'的多个控件。 FindControl要求控件具有唯一的ID。

描述:执行当前Web *请求期间发生未处理的异常。请查看堆栈跟踪以获取有关该错误的更多信息以及* *源自代码的位置。 *

异常详细信息:System.Web.HttpException:用相同的ID'标签'找到了多个控制。 ** FindControl ** 要求控件具有唯一的ID。

* 源错误:*在当前web请求的执行过程中生成

未处理的异常。 *有关异常来源和位置的信息可以使用* 以下的异常堆栈跟踪进行标识。

* 堆栈跟踪:*

*[HttpException (0x80004005): Multiple controls with the same ID 'labelName' were found.* *FindControl requires that controls have unique IDs.]* 
    *System.Web.UI.Control.FillNamedControlsTable(Control namingContainer, ControlCollection* *controls) +265* 
    *System.Web.UI.Control.FillNamedControlsTable(Control namingContainer, ControlCollection* * controls)* +311 
    *System.Web.UI.Control.FindControl(String id, Int32 pathOffset) +145* 
    *System.Web.UI.Control.FindControl(String id, Int32 pathOffset) +365* 
    *System.Web.UI.Control.FindControl(String id, Int32 pathOffset) +365* 
    *System.Web.UI.Control.FindControl(String id, Int32 pathOffset) +365* 
    *System.Web.UI.Control.FindControl(String id, Int32 pathOffset) +365* 
    *System.Web.UI.Page.FindControl(String id) +38* 
    *System.Web.UI.Page.ProcessPostData(NameValueCollection postData, Boolean fBeforeLoad)* +287 
    *System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean* *includeStagesAfterAsyncPoint) +4911* 
  • 我不知道为什么这个错误就要昨天是wroking罚款,但是当我使用 * FindControl已在行的特殊细胞它开始给我错误,但现在我删除*该代码和点击按钮它显示错误。* 请给你的* **建议,以便如果我格式错误后的问题,我还可以移动

对不起或提供足够的数据

+0

在你每一个控制web应用应该有一个唯一的ID相同id..Find两个或更多的控制。 – coder

+0

你在哪里使用ID为'labelName'的标签,你可以向我们展示gridview设计代码.. –

+0

@AmolKolekar请检查顶部的代码现在我动态创建模板字段并将它们添加到gridview编程 – Ranjan

回答

1

请阅读堆栈跟踪!

第一行:“用相同的ID‘标签’多个控件中发现”

检查您查看多个控件使用相同的ID。

编辑:

尝试按Ctrl + F,搜索标签。如果你在同一文件中找到2 ..你找到了你的问题...

+0

感谢您的关注和建议,但是我在GridView中动态创建的模板字段中使用了这个'labelName'标签。参考请参阅createTemplatedgridview()方法。这个labelName我用那里,但现在我试图读取row.cells控制。但未点击按钮点击事件。我把断点,但这也不起作用。任何建议 – Ranjan

+0

请看看代码 – Ranjan

+0

我没有在任何地方使用Find Control。早些时候我用过,但删除后,如果您不使用查找控制,我得到上述错误 – Ranjan

0

在您的网页存在与控制,并给它不同的ID

+0

我同意你,但请阅读我的问题... – Ranjan