关于ObjectDataSource搜索数据的问题

本文探讨了ASP.NET中GridView控件与ObjectDataSource组件的高级应用技巧,包括如何通过三层架构实现数据检索、更新及搜索功能,并解决了常见的错误与挑战。
1. 既然利用了三层构架,那么就要充分利用三层构架的优势,利用Bll中的方法(如果没有可以在强类型的DataSet中创建,然后在TableAdapter中封装,创建public方法)去支持Select,Update,delete等方法,如果想利用一个搜索到的记录集直接赋值给GridView的DataSource,那么,对该搜索记录的操作只能手动编写代码去实现,比如command,connection等. 因为没有经过ObjectDataSource,所以不能调用ObjectDataSource的方法.而此时GridView只做为一个显示容器或控件,它的Select,Update,delete等方法对记录集不起作用.只起到一个显示作用.

2,在操作过程中,因为GridView的一些事件触发,要明白它们发生的先后顺序,否则可能一塌糊涂. 如下
在*ing中不能加入*的操作代码,比如RowEditing中加入DispalyAllBar.UpdateRow(e.RowIndex,true);这类操作代码, 会引起无限循环,RowUpdating发生在UpdateRow之前,这样的话,在RowUpdating里进行UpdateRow,而UpdateRow又会引起RowUpdating动作,这样就形成一个无限循环了.(*为Delete,Update,Cancel)

3 注意, GridView的viewState状态保存会影响搜索出来的记录编辑. 有时ViewState的设置很重要.

4.关于在执行时引发的未能找到带参数的非泛型方法
出现这个问题大多是在使用ObjectDataSource的时候.这时的数据读取,删除,编辑,添加等都是使用的你在BLL中抽象出来的方法.举个例子,一个表有4列属性,select以后会在detailview中产生4行内容,其中有一行是不用更新的,于是你在方法中没有设定这个参数.如果你要对这条选定的数据进行更新,那么ObjectDataSource默认是有4个属性的,但是你的方法确只有3个.这时就会出现"未能找到带参数的非泛型方法".其实你好好看看报错的内容就知道,肯定是默认的参数个数多出了你定义的个数.要解决其实也简单.一是直接删除ObjectDataSource中自动生成的那些Update参数.二是在你的方法中定义跟你显示的数据一样多的参数.大不了设定了不用,.也可能是属性名跟数据库中的参数名不同导致.(查看参数集合中的参数个数和参数名,查看BLL中类的方法是否正确,最好是用主键作为查找或删除的依据.是否显示控件在ViewState中保持了视图,如果实在不行,将控件删除重建.)

5. cmd.CommandText = "update Guba_Admin_Disp set loginip='" + Request.UserHostAddress.ToString() + "',loginTime=loginTime+1,logindate='"+DateTime.Now.ToString()+"' where username ='" + TextUserName.Text.Trim() + "'";DateTime的类型的数据要用string数据写入(而在某些编程方式中又不同)

6.关于ObjectDataSource搜索数据记录方法;

主要是靠动态设置ObjectDataSource的SelectMethod(ObjectDataSource初始状态不能设置,设为空.只设置它的TypeName(BLL中的类名).而SelectMethod的值必须是TypeName中的方法名. 因为Postback时ObjectDataSource会重新绑定SelectMethod方法,从以下重复的代码也可以看出,一旦Postback就要重新设置ObjectDataSource的SelectMethod的值,这个问题可以考虑一下).这样得到的结果集(我们想要的搜索结果)的处理方法还是按照ObjectDataSource原来设置的的方法来处理,比如Update,Delete,Insert...

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;


public partial class PostBarManage_AllPostBar : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

        if (TextSearch.Text.Trim() == "")
        {
            DataSourceAllBar.SelectParameters.Clear();

            DataSourceAllBar.SelectMethod = "GetBoardDisp";
            DataSourceAllBar.Select();

        }
        else
        {

            if (RadioCode.Checked)
            {
                DataSourceAllBar.SelectParameters.Clear();

                DataSourceAllBar.SelectMethod = "GetBoardDispByStockNO";

                DataSourceAllBar.SelectParameters.Add("StockNO", TypeCode.String, string.Format("{0}", TextSearch.Text));

                DataSourceAllBar.Select();
               
            }

            if (RadioName.Checked)
            {
                DataSourceAllBar.SelectParameters.Clear();
                DataSourceAllBar.SelectMethod = "GetBoardDispByBoardName";
                DataSourceAllBar.SelectParameters.Add("BoardName", TypeCode.String, string.Format("{0}", TextSearch.Text));
                DataSourceAllBar.Select();
            }
        }
        //if (DispalyAllBar.Rows.Count < 1) 代码放的位置未确定
         //   LbMessage.Visible = true;
    }
    protected void BtnSearch_Click(object sender, EventArgs e)
    {
        if (TextSearch.Text.Trim() == "")
        {
            DataSourceAllBar.SelectParameters.Clear();

            DataSourceAllBar.SelectMethod = "GetBoardDisp";

            DataSourceAllBar.Select();

        }
        else
        {

            if (RadioCode.Checked)
            {
                DataSourceAllBar.SelectParameters.Clear();

                DataSourceAllBar.SelectMethod = "GetBoardDispByStockNO";

                DataSourceAllBar.SelectParameters.Add("StockNO", TypeCode.String, string.Format("{0}", TextSearch.Text));

                DataSourceAllBar.Select();

            }

            if (RadioName.Checked)
            {
                DataSourceAllBar.SelectParameters.Clear();
                DataSourceAllBar.SelectMethod = "GetBoardDispByBoardName";
                DataSourceAllBar.SelectParameters.Add("BoardName", TypeCode.String, string.Format("{0}", TextSearch.Text));
                DataSourceAllBar.Select();
            }            
        }        
    }  
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值