事件与委托例子

?





1

2

3

4

5

6

7

8

9

10

<Window x:Class="DelegateAndEvent.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        Title="DelegateAndEvent"
Height="410"
Width="347">

    <DockPanel LastChildFill="True"
Margin="5">

        <StackPanel Name="sp_list"
DockPanel.Dock="Top"
HorizontalAlignment="Center"
VerticalAlignment="Top">

            <TextBlock Name="tb_sum"
Width="271"
Height="25"></TextBlock>

        </StackPanel>

    </DockPanel>

</Window>

  


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace DelegateAndEvent
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
List _list;

public MainWindow()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
}

void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
_list = new List();
this.sp_list.Children.Insert(0, _list);

_list.SumEvent += new List.SumEvenetHandler(_list_SumEvent);

}

void _list_SumEvent(List.SumEvenetArgs e)
{
this.tb_sum.Text = e.Count.ToString();
}
}
}

?





1

2

3

4

5

6

7

8

9

10

<ListView x:Class="DelegateAndEvent.List"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        Loaded="ListView_Loaded">

    <ListView.Resources>

        <DataTemplate x:Key="dt_text">

            <TextBox Width="300"
Height="25"
Text="{Binding text}"
Tag="{Binding tag}"
TextChanged="TextBox_TextChanged"
KeyDown="TextBox_KeyDown"
GotFocus="TextBox_GotFocus"></TextBox>

        </DataTemplate>

    </ListView.Resources>

</ListView>

  


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Collections;
using System.Windows.Threading;
using System.Data;
using System.Data.Sql;

namespace DelegateAndEvent
{
/// <summary>
/// List.xaml 的交互逻辑
/// </summary>
public partial class List : ListView
{
public ListView objListView = new ListView();
GridView objBillGridView = new GridView();
int rows = 0;
System.Data.DataTable dt = new System.Data.DataTable();
TextBox tb;
int tag;
DispatcherTimer dst;

/// <summary>
/// 注册委托
/// </summary>
/// <param name="e"></param>
public delegate void SumEvenetHandler(SumEvenetArgs e);

/// <summary>
/// 注册事件
/// </summary>
public event SumEvenetHandler SumEvent;

public virtual void OnSumEvent()
{
if (SumEvent != null)
{
SumEvenetArgs e = new SumEvenetArgs(dt);
SumEvent(e);
}
}

public double SumCount;

/// <summary>
///
/// </summary>
public class SumEvenetArgs : EventArgs
{
private double count;

public double Count
{
get { return count; }
set { count = value; }
}

public SumEvenetArgs(DataTable dt)
{
this.count = (from p in dt.AsEnumerable()
select p).Sum(x => Convert.ToDouble(x.Field<string>("text")));
}
}

public List()
{
InitializeComponent();
}

private void ListView_Loaded(object sender, RoutedEventArgs e)
{
objListView = sender as ListView;
objBillGridView = new GridView();
GridViewColumn gvc = new GridViewColumn();
gvc.Header = "求和";
gvc.CellTemplate = (DataTemplate)this.Resources["dt_text"];
objBillGridView.Columns.Add(gvc);

objListView.View = objBillGridView;

dt.Columns.Add("text", typeof(string));
dt.Columns.Add("tag", typeof(int));
dt.Rows.Add();
dt.Rows[rows]["text"] = "10";
dt.Rows[rows]["tag"] = rows + 1;
rows++;

objListView.ItemsSource = dt.DefaultView;

OnSumEvent();
}

private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
TextBox tbx = sender as TextBox;
if (tbx.Text == "")
{
return;
}
OnSumEvent();
}

private void TextBox_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
if (tag == dt.Rows.Count)
{
dt.Rows.Add();
dt.Rows[rows]["text"] = "0";
dt.Rows[rows]["tag"] = rows + 1;
rows++;
}
dst = new DispatcherTimer();
dst.IsEnabled = true;
dst.Start();
dst.Interval = TimeSpan.FromSeconds(0.1);
dst.Tick += new EventHandler(dst_Tick);
}
}

void dst_Tick(object sender, EventArgs e)
{
dst.Stop();
IEnumerable<TextBox> _tx = FindChildren<TextBox>(this);

TextBox objcmbCtrls = _tx.ElementAt<TextBox>(tag) as TextBox;

objcmbCtrls.Focus();
dst = null;
OnSumEvent();
}

private void TextBox_GotFocus(object sender, RoutedEventArgs e)
{
tb = sender as TextBox;
tag = int.Parse(tb.Tag.ToString());
OnSumEvent();
}

#region 找控件
public IEnumerable<T> FindChildren<T>(DependencyObject parent) where T : class
{
var count = VisualTreeHelper.GetChildrenCount(parent);
if (count > 0)
{
for (var i = 0; i < count; i++)
{
var child = VisualTreeHelper.GetChild(parent, i);
var t = child as T;
if (t != null)
yield return t;

var children = FindChildren<T>(child);
foreach (var item in children)
yield return item;
}
}
}
#endregion
}
}

事件与委托例子,码迷,mamicode.com

时间: 2024-10-04 00:57:30

事件与委托例子的相关文章

c#.NET的事件与委托例子

原文发布时间为:2008-07-25 -- 来源于本人的百度文章 [由搬家工具导入] 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.WebContro

事件委托例子(可跨窗口操作)

事件委托例子: using System; using System.Drawing; using System.Windows.Forms; namespace 跨窗体调用控件 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 f = new Form2();

从事件来看委托

事件是基于委托,为委托提供了一种发布/订阅机制,在dotNet到处都能看到事件,一个简单的例子就是在windows应用程序中,Button类提供了Click事件,这类事件就是委托,触发Click事件时调用的处理程序方法需要定义,其参数也是由委托类型定义的,事件模型可以用下图简要说明. 在这个模型中,事件的响应者通过订阅关系直接关联在事件拥有者的事件上,我们把这种事件模型或者CLR事件模型.因为CLR事件本质上是一个委托实例,我们暂且模仿CLR属性的说法,把CLR事件定义为一个委托类型实例的包装器

事件与委托

C# 中的委托和事件 文中代码在VS2005下通过,由于VS2003(.Net Framework 1.1)不支持隐式的委托变量,所以如果在一个接受委托类型的位置直接赋予方法名,在VS2003下会报错,解决办法是显式的创建一个委托类型的实例(委托变量).例如:委托类型 委托实例 = new 委托类型(方法名); 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易

C# 事件与委托的区别

C# 事件与委托的区别 先看一段程序 class Program { static void Main(string[] args) { Test obj = new Test(); obj.print += printout1; //绑定printout1方法 obj.print += printout2; //绑定printout2方法 obj.start(); } static void printout1() { Console.WriteLine("输出第一段字符串"); }

委托例子

//一般来说,委托的 定义和执行 是在一个类里的, 绑定事件 在另一个类里,通过实例化 发布者  a,然后用 a绑定要执行的事件. namespace delegatetest{ //订阅者public class mainform { //具体要执行的方法public void addproduct(string prodid, string prodname, int num) { ///.... } //执行订阅的事件 public void click() { //PDA程序是通过反射加

面向对象基础——事件和委托

事件和委托 在典型的面向对象软件的一般流程中,代码段创建类的对象并在该对象上调用力法.在这种情况下,调用程序是主动代码,因为它们是调用方法的代码.而对象是被动的,因为只有当某种方法被调用时才会用上对象并执行某种动作. 然而,也可能存在相反的情况.对象可以执行一些任务并在执行过程中发生某些事情时通知调用程序.称这类事情为事件(event),对象的事件发布称为引发事件. 事件驱动处理对于.NET来说并不是什么技术,在事件驱动处理中,当有事件发生时,某些代码段会通知其他对事件感兴趣的代码段.当用户使用

C#事件与委托详解【精华 多看看】

Delegate delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类.与其它的类不同,delegate类能够拥有一个签名(signature),并且它"只能持有与它的签名相匹配的方法的引用".它所实现的功能与C/C++中的函数指针十分相似.它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m.但与函数指针相比,delegate有许多函数委托和事件在 .Net Framework中的应用非常广泛指针不具备的优点.首先,函数指针只能指

C#基础知识之事件和委托

本文中,我将通过两个范例由浅入深地讲述什么是委托.为什么要使用委托.事件的由来..Net Framework中的委托和事件.委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论. 委托的引入:将方法作为方法的参数 我们先不管这个标题如何的绕口,也不管委托究竟是个什么东西,来看下面这两个最简单的方法,它们不过是在屏幕上输出一句问候的话语: public void GreetPeople(string name) { EnglishGreeting(name); } public