给梦一个奔跑的方向!
PDF Print E-mail
User Rating: / 2
PoorBest 
Written by xlingfairy
Thursday, 25 June 2009 17:54
做.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 的 UpdateParametersInsertParameters添加参数,来解决这个问题。

    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长时间,才发现是因为数据表里少定义了主键。汗。。。。
Last Updated ( Thursday, 25 June 2009 18:07 )
 

Add comment


Security code
Refresh

Popular Contents

Recommend

Site Info

Members : 1
Content : 130
Web Links : 7
Content View Hits : 99620

Links