<转>DataList1.EditItemIndex = e.Item.ItemIndex的理解

如何理解DataList1.EditItemIndex = e.Item.ItemIndex
DataList1.EditItemIndex=e.Item.ItemIndex这句话;
首先 知道
EditItemIndex
获取或设置 DataList 控件中要编辑的选定项的索引号。

明白一点 第一 这个 EditItemIndex包含着选定项要进行编辑的隐含参数 也就是说 选定了这个属性 默认你选定的项 就是要编辑的项


Item 实际上就是Item的单独项
ItemIndex就是Item的选项号
但是到底什么是Item呢 实际上我们理解这个Item的意义可以通过这样一个例子来理解

CancelCommand 对 DataList 控件中的某个项单击 Cancel 按钮时发生。

DeleteCommand 对 DataList 控件中的某个项单击 Delete 按钮时发生。

EditCommand 对 DataList 控件中的某个项单击 Edit 按钮时发生。
ItemCommand 当单击 DataList 控件中的任一按钮时发生

DeleteCommand 用了之后 基本上一个模板里边的一个项 包括label 包括其他按钮 就全都删除了
同理


ItemCommand就代表一个项 包括所有的label的等等的 一个模块里边的项

ItemIndex这个也就是这个项的编号
e.Item.ItemIndex 这个就是发生事件的项的项的编号
DataList.EditItemIndex 这个呢 就是控件的要编辑的项的项编号

另外一个问题 为何左边不是DataList.Item.ItemIndex 这样写呢
首先 datalist1这是一个datalist类的实例
item当然可以作为它的属性 可是问题是 这个EditItemIndex这个属性一般是在按了控件内部设定的编辑发生的
如下代码
protected void DataList1_EditCommand(object source, DataListCommandEventArgs e)
    {
        DataList1.EditItemIndex = e.Item.ItemIndex;
        DBBind();
    }

那么此时已经把编辑的参数传了进来
DataList1.Item.ItemIndex 这样就使把item的属性继承
实际上没有任何作用
protected void DataList1_EditCommand(object source, DataListCommandEventArgs e)
这个参数传递的实际意义可以这样理解 激活了EditItemIndex 将编辑按钮和EditItemIndex参数进行关联
传递了当前ItemIndex的编号
可是现在EditItemIndex参数是空缺的 如果你不对它赋值 编辑按钮将不起任何作用 因为它不知道该编辑哪一项

   public void DBBind()
    {
        SqlConnection myConn = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString"].ToString());
        myConn.Open();
        string sqlStr = "select * from tb_GoodsInfo";
        SqlDataAdapter da = new SqlDataAdapter(sqlStr, myConn);
        DataSet ds = new DataSet();
        da.Fill(ds, "Goods");
        DataList1.DataSource = ds.Tables["Goods"].DefaultView;
        DataList1.DataKeyField = "GoodsID";
        DataList1.DataBind();
        myConn.Close();

    }
上边是dbbbind()的邦定函数
实际上就是把GoodsID为主键的表绑定到DataList1上
实际上也就是 DataList1.DataKeyField = "GoodsID"这个东西就相当于e.Item.ItemIndex也相当于DataList1.EditItemIndex

protected void DataList1_EditCommand(object source, DataListCommandEventArgs e)
    {
        DataList1.EditItemIndex = e.Item.ItemIndex;
        DBBind();
    }
这么个函数里边 只有两个函数 并且没有返回 证明了 所有的事件将在这里边发生 只要把EditItemIndex得到具体的值了 就会进行进行

下边说一下 DataList1_EditCommand(object source, DataListCommandEventArgs e)
这个事件怎么理解

公共事件
对 DataList 控件中的某个项单击 Edit 按钮时发生。
public event DataListCommandEventHandler EditCommand
这是把事件给声明了

受保护的方法
OnEditCommand 引发 EditCommand 事件。这使您可以为事件提供自定义处理程序。

C#
protected virtual void OnEditCommand (
DataListCommandEventArgs e
)

下边进一步对上述东西进行剖析
DataListCommandEventHandler
表示将处理 DataList 控件的 CancelCommand、DeleteCommand、EditCommand、ItemCommand 和 UpdateCommand 事件的方法。

public delegate void DataListCommandEventHandler (
Object source,
DataListCommandEventArgs e
)

然后再对DataListCommandEventArgs 进行剖析

初始化 DataListCommandEventArgs 类的新实例。
C#
public DataListCommandEventArgs (
DataListItem item,
Object commandSource,
CommandEventArgs originalArgs
)

公共属性
Item 获取 DataList 控件中包含命令源的项。
CommandSource 获取命令源。
CommandName   获取命令的名称。(从 CommandEventArgs 继承。)
CommandArgument   获取命令的参数。(从 CommandEventArgs 继承。)

Item
public DataListItem Item { get; }

所有的这些说明了什么问题?
说明 这个编辑按钮一点击,一些参数就传递过来了。
传递的参数只有 Item 这里边的内容 CommandSource 从哪个控件命令传来的 CommandName 控件命令的名称 CommandArgument控件一起传来的参数 Object source 哪个控件
也就是说 只有这些有数值 被传进函数内部 事件内部 可以调用 其他的想干吗 得赋值

DataList1.EditItemIndex = e.Item.ItemIndex;
这个语句里边 明显EditItemIndex不适Item的选项 所有得赋值才能有效

这就是一个圈子 控件关联Item传值 传后再传回EditItemIndex 按钮关联EditItemIndex 结果起效果
所以就是这样 因为控件很多item 如果不进行细分 每个item响应所有按钮 那就麻烦了 所以进行细分到 EditItemIndex 所以发生事件时 EditItemIndex 没有值 这个是事件之后给赋上去的 目的就是 激发才会有值 不激发不会有值 不激发用整体的值来操作 激发了用事件的值来进行操作

理解了这一点 就理解了Item和EditItemIndex的关系 就不会用错了

posted @ 2010-09-17 16:20  eva.xiao  阅读(719)  评论(0编辑  收藏  举报