做.NET也有一段时间了,高深的东东还没机会接触,但是基础的东东仍然不熟,就如这个 GridView:
在GridView 上绑定某个字段,但是当字段值为 null 或为空时,要用另外的值代替。
不懂Eval也不懂Bind,因为压根就没有看这部分的教程。搜MSDN,搜GOOGLE,百度,找到个 Container.DataItem
于是这样写:
<asp:ObjectDataSource ID="ds" runat="server"
TypeName="Commerce.Common.NewsLetterCtxController"
InsertMethod="Insert"
UpdateMethod="Update"
DeleteMethod="Delete"
SelectMethod="GetAll" />
。。。
。。。
<asp:TemplateField HeaderText="Ctx">
<ItemTemplate>
<asp:TextBox ID="txtCtx" runat="server" Text='<%# Bind("Ctx") %>' Width="300" Rows="5" TextMode="MultiLine"></asp:TextBox>
</ItemTemplate>
<EditItemTemplate>
<FCKeditorV2:FCKeditor ID="fckCtx" runat="server" Width="600px" Height="400px" Value='<%# checkCtx(DataBinder.Eval(Container.DataItem,"Ctx")) %>'></FCKeditorV2:FCKeditor>
</EditItemTemplate>
</asp:TemplateField>
。。。
protected string checkCtx(object ctx) {
if (string.IsNullOrEmpty((string)ctx)) {
string html = "";
//some code
return html;
} else return (string)ctx;
}
但是这样一来,在新增(用 DetailView 模拟的)、修改的时候,会因为:<%# checkCtx(DataBinder.Eval(Container.DataItem,"Ctx")) %> 修改了绑定,而报参数数目不对之类的错误。
GridView 新增、删除、修改 里,我研究过如何结合 DetailView 对GridView 进行新增、删除、修改,那个时候,我就遇到过这样的问题。
经过Debug ,找到 GridView 的RowCommand事件 和 DetailView 的ItemCommand 事件,在它们里面为 DatasourceObject 的 UpdateParameters和InsertParameters添加参数,来解决这个问题。
protected void gd_RowCommand(object sender, GridViewCommandEventArgs e) {
switch (e.CommandName) {
case "New"://GridView not support New
gd.DataSourceID = "";
gd.DataBind();
break;
case "Update":
Parameter pm = new Parameter("ctx", System.Data.DbType.String, ((FCKeditor)gd.Rows[((GridView)sender).EditIndex].FindControl("fckCtx")).Value);
ds.UpdateParameters.Add(pm);
break;
}
}
protected void gd_RowDeleting(object sender, GridViewDeleteEventArgs e) {
Parameter pm = new Parameter();
pm.Name = "id";
pm.DbType = System.Data.DbType.Object;
pm.DefaultValue = ((Label)gd.Rows[e.RowIndex].FindControl("lblID")).Text;
ds.DeleteParameters.Add(pm);
}
protected void dv_ItemCommand(object sender, DetailsViewCommandEventArgs e) {
if (e.CommandName == "Cancel") {
gd.DataSourceID = "ds";
gd.DataBind();
} else if (e.CommandName == "Insert") {
Parameter pmCtx = new Parameter("ctx",System.Data.DbType.String,((FCKeditor)((DetailsView)sender).FindControl("fckCtx")).Value);
ds.InsertParameters.Add(pmCtx);
}
}
在GridView 上绑定某个字段,但是当字段值为 null 或为空时,要用另外的值代替。
不懂Eval也不懂Bind,因为压根就没有看这部分的教程。搜MSDN,搜GOOGLE,百度,找到个 Container.DataItem
于是这样写:
<asp:ObjectDataSource ID="ds" runat="server"
TypeName="Commerce.Common.NewsLetterCtxController"
InsertMethod="Insert"
UpdateMethod="Update"
DeleteMethod="Delete"
SelectMethod="GetAll" />
。。。
。。。
<asp:TemplateField HeaderText="Ctx">
<ItemTemplate>
<asp:TextBox ID="txtCtx" runat="server" Text='<%# Bind("Ctx") %>' Width="300" Rows="5" TextMode="MultiLine"></asp:TextBox>
</ItemTemplate>
<EditItemTemplate>
<FCKeditorV2:FCKeditor ID="fckCtx" runat="server" Width="600px" Height="400px" Value='<%# checkCtx(DataBinder.Eval(Container.DataItem,"Ctx")) %>'></FCKeditorV2:FCKeditor>
</EditItemTemplate>
</asp:TemplateField>
。。。
protected string checkCtx(object ctx) {
if (string.IsNullOrEmpty((string)ctx)) {
string html = "";
//some code
return html;
} else return (string)ctx;
}
但是这样一来,在新增(用 DetailView 模拟的)、修改的时候,会因为:<%# checkCtx(DataBinder.Eval(Container.DataItem,"Ctx")) %> 修改了绑定,而报参数数目不对之类的错误。
GridView 新增、删除、修改 里,我研究过如何结合 DetailView 对GridView 进行新增、删除、修改,那个时候,我就遇到过这样的问题。
经过Debug ,找到 GridView 的RowCommand事件 和 DetailView 的ItemCommand 事件,在它们里面为 DatasourceObject 的 UpdateParameters和InsertParameters添加参数,来解决这个问题。
protected void gd_RowCommand(object sender, GridViewCommandEventArgs e) {
switch (e.CommandName) {
case "New"://GridView not support New
gd.DataSourceID = "";
gd.DataBind();
break;
case "Update":
Parameter pm = new Parameter("ctx", System.Data.DbType.String, ((FCKeditor)gd.Rows[((GridView)sender).EditIndex].FindControl("fckCtx")).Value);
ds.UpdateParameters.Add(pm);
break;
}
}
protected void gd_RowDeleting(object sender, GridViewDeleteEventArgs e) {
Parameter pm = new Parameter();
pm.Name = "id";
pm.DbType = System.Data.DbType.Object;
pm.DefaultValue = ((Label)gd.Rows[e.RowIndex].FindControl("lblID")).Text;
ds.DeleteParameters.Add(pm);
}
protected void dv_ItemCommand(object sender, DetailsViewCommandEventArgs e) {
if (e.CommandName == "Cancel") {
gd.DataSourceID = "ds";
gd.DataBind();
} else if (e.CommandName == "Insert") {
Parameter pmCtx = new Parameter("ctx",System.Data.DbType.String,((FCKeditor)((DetailsView)sender).FindControl("fckCtx")).Value);
ds.InsertParameters.Add(pmCtx);
}
}
还有个比较郁闷的事:新增、删除、修改的时候,报这样的错误:
(删除时,报的错)
Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.
Source Error:
Line 156:
Line 157: public static void delete(int ID) {
Line 158: NewsletterCtx.Delete(ID);
Line 159: }
Line 160: }
[NullReferenceException: Object reference not set to an instance of an object.]
SubSonic.ActiveRecord`1.GetDeleteCommand(Object keyID) +256
SubSonic.ActiveRecord`1.Delete(Object keyID) +1367
Commerce.Common.NewsletterCtxController.delete(Int32 ID) in d:\NET\xxx\App_Code\DataAccess\Store\Generated\NewsletterCtx.cs:158
这个 NewsletterCtx 是继承 Subsonic.ActiveRecord 类的, Delete 方法是 Subsonic.ActiveRecord 提供的,这里却报 NullReferenceException的错,实在不解。调试了N长时间,才发现是因为数据表里少定义了主键。汗。。。。
| < Prev | Next > |
|---|
Last Updated ( Thursday, 25 June 2009 18:07 )



