急~~,关于动态添加gridview列的问题,救命

江川GG 2009-03-24 09:13:01
我定义了一个GridViewTemplate类,GridViewTemplate.cs如下:
public class GridViewTemplate : ITemplate
{
private DataControlRowType templateType;
private string columnName;
private Control columnControl;
private string dataField;
private string ControlType;

public GridViewTemplate(DataControlRowType type, string colname)
{
templateType = type;
columnName = colname;
columnControl = null;
ControlType = "";
}

public GridViewTemplate(DataControlRowType type, string colname, Control ctr,string strControlType)
{
templateType = type;
columnName = colname;
columnControl = ctr;
ControlType = strControlType;
}
public GridViewTemplate(DataControlRowType type, string colname, string datafield, Control ctr)
{
templateType = type;
columnName = colname;
columnControl = ctr;
dataField = datafield;

}

public GridViewTemplate(DataControlRowType type, string colname, string datafield)
{
templateType = type;
columnName = colname;
columnControl = null;
dataField = datafield;
}

public void InstantiateIn(System.Web.UI.Control container)
{
switch (templateType)
{
case DataControlRowType.Header:
Literal lc = new Literal();
lc.Text = columnName;
container.Controls.Add(lc);
break;
case DataControlRowType.DataRow:
if (columnControl != null)
{

switch (ControlType)
{
case "LinkButton":
container.Controls.Add(lb);
break;

//case "LinkButton": container.Controls.Add(columnControl); break;
default:
break;

}

}
else
{
Literal lcnoctr = new Literal();
lcnoctr.Text = columnName;
if (dataField != "" && dataField != null)
{
lcnoctr.DataBinding += new EventHandler(tb_DataBinding);
}
container.Controls.Add(lcnoctr);

}

break;
default:
break;
}
}

=============================================================
然后我在另外一个页面index.aspx.cs里面调用这个类去产生新的列:
TemplateField mycustomField = new TemplateField(); //创建列实例
mycustomField.ShowHeader = true; // 设置属性
LinkButton lb = new LinkButton();
lb.Text = "生成告知函";
lb.ID = "lbAlertLetter";
lb.Click += new EventHandler(lbAlertLetter_Click);

mycustomField.HeaderTemplate = new GridViewTemplate(DataControlRowType.Header, "<span>Title</span>");
mycustomField.ItemTemplate = new GridViewTemplate(DataControlRowType.DataRow, "", lb, "LinkButton");
dv.Columns.Add(mycustomField);

现在就有一个问题了,这样添加进去之后,新添加的列只有最后一个才有linkbutton,我想了下应该是这个new LinkButton在外面实例化了一次造成的,但是如果在GridViewTemplate.cs里面实例化LinkButton,例如(替换红色部分)

case "LinkButton":
                LinkButton lb = new LinkButton;
lb.text = "生成告知函";
container.Controls.Add(lb);
break;
那如何去响应外面index.aspx.cs页面里的
lbAlertLetter_Click事件呢?
...全文
149 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
benbirdar 2009-03-25
  • 打赏
  • 举报
回复
代码太长了,友情帮顶
WeekWant 2009-03-25
  • 打赏
  • 举报
回复
给个我的理解吧:
你现在是再UC外面传进来了一个LinkButton对象。
这个对象需要被你加载多次,GridView的数据条数决定。

那么你是否可以取到GridView中数据的个数,传到UC中呢?
然后在UC中去New LinkButton呢?

这样不知道会不会有问题?
-LanPei- 2009-03-25
  • 打赏
  • 举报
回复
哦。忘了说了上面的那些代码是在用户控件里编写的。
-LanPei- 2009-03-25
  • 打赏
  • 举报
回复
// 编辑事件关键字
private static readonly string editEvent = "_EditEvent";

/// <summary>
/// 添加或移除编辑事件
/// </summary>
public event EventHandler EditEvent
{
add
{
this.Events.AddHandler(editEvent, value);
}
remove
{
this.Events.RemoveHandler(editEvent, value);
}
}

/// <summary>
/// 编辑事件函数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnAdd_Click(object sender, EventArgs e)
{
EventHandler handler = this.Events[editEvent] as EventHandler;

if (handler != null)
{
handler(this, e);
}
}

/// <summary>
/// 控件初始化函数
/// </summary>
/// <param name="e"></param>
protected override void OnInit(EventArgs e)
{
base.OnInit(e);

this.btnAdd.Click += new EventHandler(this.btnAdd_Click);
}


然后在.aspx.cs页中添加这个控件的EditEvent的事件处理函数,即可将“这个控件中的控件的事件”升级为“这个控件的事件”。
weir55 2009-03-25
  • 打赏
  • 举报
回复
不懂,帮顶一下
江川GG 2009-03-24
  • 打赏
  • 举报
回复
Sandy945
我试过,没有响应lbAlertLetter_Click事件,
我的gridview是放在一个ascx里面的,
阿非 2009-03-24
  • 打赏
  • 举报
回复

case "LinkButton":
                LinkButton lb = new LinkButton;
lb.ID="lbtn";
lb.text = "生成告知函";
container.Controls.Add(lb);
break;




GridView_RowDataBound 事件中

LinkButton lbtn=e.Row.FindControl("lbtn") as LinkButton ;
if(lbtn!=null)
{
lbtn.Click += new EventHandler(lbAlertLetter_Click);

}

bizbuy 2009-03-24
  • 打赏
  • 举报
回复
这个问题,如果要简单一点最好办

就在数据源中增加一列,gridview绑定的时候就增加了一列
马老虎 2009-03-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Sandy945 的回复:]
C# code
case "LinkButton":
                LinkButton lb = new LinkButton;
lb.ID="lbtn";
lb.text = "生成告知函";
container.Controls.Add(lb);
break;






C# code
GridView_RowDataBound 事件中

LinkButton lbtn=e.Row.FindControl("lbt…
[/Quote].

62,268

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧