[ZT]DataGrid中TextBox的onChange事件解决方法
微软的控件功能很强,开发起来容易上手,可是需求总是不能满足的。所以我们为了满足不同需求,会重写一控件.
就比如DataGrid中TextBox的onChange事件.DataGrid捕获不到,TextBox和Button不一样.Button有commandName属性,我们可以用commandName属性来区别触发的事件.如果要实现TextBox的onChange事件让DataGrid捕获,那就需要事件提升,现在有2种解决方案第一种,重写TextBox控件
前台代码
![]()
1
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default3.aspx.cs" Inherits="Default3" %>
2
<%@ Register Namespace ="Abin.Controls" TagPrefix="Abin"%>
3
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4![]()
5
<html xmlns="http://www.w3.org/1999/xhtml" >
6
<head runat="server">
7
<title>无标题页</title>
8
</head>
9
<body>
10
<form id="form1" runat="server">
11
<div>
12
<asp:DataGrid ID="DataGrid1" runat="server" AutoGenerateColumns="False"
13
OnItemCommand="DataGrid1_ItemCommand">
14
<Columns>
15
<asp:TemplateColumn>
16
<ItemTemplate>
17
<Abin:CommandTextBox ID="TextBox1" runat="server" CommandName="OnChange" AutoPostBack="True"></Abin:CommandTextBox>
18
</ItemTemplate>
19
<HeaderTemplate>
20
工号
21
</HeaderTemplate>
22
</asp:TemplateColumn>
23
<asp:TemplateColumn>
24
<ItemTemplate>
25
<Abin:CommandTextBox ID="TextBox2" runat="server" BackColor="LightGray" ReadOnly="True"></Abin:CommandTextBox>
26
</ItemTemplate>
27
<HeaderTemplate>
28
名字
29
</HeaderTemplate>
30
</asp:TemplateColumn>
31
</Columns>
32
</asp:DataGrid></div>
33
</form>
34
</body>
35
</html>
36![]()
37
![]()
1
using System;
2
using System.Web.UI.WebControls;
3
using Abin.Controls;
4![]()
5
public partial class Default3 : System.Web.UI.Page
6
{
7
#region Page_load
8
protected void Page_Load(object sender, EventArgs e)
9
{
10
if (!IsPostBack)
11
{
12
BindDataGrid();
13
}
14
}
15
#endregion
16![]()
17
#region DataGrid绑定
18
private void BindDataGrid()
19
{
20
DataGrid1.DataSource = new string[] { "Abin", "Abin", "Abin", "Abin", "Abin", "Abin" };
21![]()
22
DataGrid1.DataBind();
23
}
24
#endregion
25![]()
26
#region GetResult
27
private string GetResult(string strName)
28
{
29
if (strName == "033221")
30
{
31
return "阿滨";
32
}
33
else if (strName == "033222")
34
{
35
return "小猪";
36
}
37
else if (strName.Length == 0)
38
{
39
return null;
40
}
41
else
42
{
43
return "沒有找到";
44
}
45
}
46
#endregion
47![]()
48
#region DataGrid1_ItemCommand
49
protected void DataGrid1_ItemCommand(object source, DataGridCommandEventArgs e)
50
{
51
if (e.CommandName == "OnChange")
52
{
53
string currenttxtName = null;
54![]()
55
int index = e.Item.ItemIndex;
56![]()
57
CommandTextBox ctb = this.DataGrid1.Items[index].FindControl("TextBox1") as CommandTextBox;
58
59
if (ctb != null)
60
{
61
currenttxtName = ctb.Text;
62
}
63![]()
64
ctb = this.DataGrid1.Items[index].FindControl("TextBox2") as CommandTextBox;
65![]()
66
if (ctb != null)
67
{
68
ctb.Text = GetResult(currenttxtName);
69
}
70
}
71
}
72
#endregion
73![]()
74![]()
75
}
76![]()
77![]()
78![]()
79
重写TextBox类
80![]()
81![]()
82![]()
83
using System;
84
using System.Web.UI.WebControls;
85
using System.ComponentModel;
86
/// <summary>
87
/// CommandTextBox 的摘要说明
88
/// </summary>
89
///
90
namespace Abin.Controls
91
{
92
public class CommandTextBox : TextBox
93
{
94
属性
110![]()
111
事件冒泡
118![]()
119
重写
132
}
133
}
134![]()
135![]()
136![]()
137![]()
这样就可以实现捕获了,现在我们用第2种方法来实现
前台代码
![]()
1
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default4.aspx.cs" Inherits="Default4" %>
2![]()
3
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4![]()
5
<html xmlns="http://www.w3.org/1999/xhtml" >
6
<head runat="server">
7
<title>无标题页</title>
8
</head>
9
<body>
10
<form id="form1" runat="server">
11
<div>
12
<asp:DataGrid ID="DataGrid1" runat="server" AutoGenerateColumns="False">
13
<Columns>
14
<asp:TemplateColumn>
15
<ItemTemplate>
16
<asp:TextBox ID="TextBox1" runat="server" AutoPostBack="True" OnTextChanged="TextBox1_TextChanged"></asp:TextBox>
17
</ItemTemplate>
18
<HeaderTemplate>
19
工号
20
</HeaderTemplate>
21
</asp:TemplateColumn>
22
<asp:TemplateColumn>
23
<ItemTemplate>
24
<asp:TextBox ID="TextBox2" runat="server" AutoPostBack="True" BackColor="LightGray"></asp:TextBox>
25
</ItemTemplate>
26
<HeaderTemplate>
27
名字
28
</HeaderTemplate>
29
</asp:TemplateColumn>
30
</Columns>
31
</asp:DataGrid></div>
32
</form>
33
</body>
34
</html>
35![]()
36![]()
![]()
1
using System;
2
using System.Data;
3
using System.Configuration;
4
using System.Collections;
5
using System.Web;
6
using System.Web.Security;
7
using System.Web.UI;
8
using System.Web.UI.WebControls;
9
using System.Web.UI.WebControls.WebParts;
10
using System.Web.UI.HtmlControls;
11![]()
12
public partial class Default4 : System.Web.UI.Page
13
{
14
#region Page_load
15
protected void Page_Load(object sender, EventArgs e)
16
{
17
if (!IsPostBack)
18
{
19
BindDataGrid();
20
}
21
}
22
#endregion
23![]()
24
#region DataGrid绑定
25
private void BindDataGrid()
26
{
27
DataGrid1.DataSource = new string[] { "Abin", "Abin", "Abin", "Abin", "Abin", "Abin" };
28![]()
29
DataGrid1.DataBind();
30
}
31
#endregion
32![]()
33
#region GetResult
34
private string GetResult(string strName)
35
{
36
if (strName == "033221")
37
{
38
return "阿滨";
39
}
40
else if (strName == "033222")
41
{
42
return "小猪";
43
}
44
else if (strName.Length == 0)
45
{
46
return null;
47
}
48
else
49
{
50
return "沒有找到";
51
}
52
}
53
#endregion
54![]()
55
#region TextBox1_TextChanged
56
protected void TextBox1_TextChanged(object sender, EventArgs e)
57
{
58
TextBox tb = (TextBox)sender;
59![]()
60
if (tb != null)
61
{
62
TableCell cell = tb.Parent as TableCell;
63![]()
64
if (cell != null)
65
{
66
DataGridItem dgi = cell.Parent as DataGridItem;
67![]()
68
string currenttxtName = null;
69![]()
70
int index = dgi.ItemIndex;
71![]()
72
tb = DataGrid1.Items[index].FindControl("TextBox1") as TextBox;
73![]()
74
if (tb != null)
75
{
76
TextBox tb1 = DataGrid1.Items[index].FindControl("TextBox2") as TextBox;
77![]()
78
tb1.Text = GetResult(tb.Text);
79
}
80
}
81
}
82![]()
83
}
84
#endregion
85
}
86![]()
87
2种方法都实现了。代码很简单。我就不讲解了.
完整的代码下载
https://files.cnblogs.com/mextb1860/WebSite2.zip
就比如DataGrid中TextBox的onChange事件.DataGrid捕获不到,TextBox和Button不一样.Button有commandName属性,我们可以用commandName属性来区别触发的事件.如果要实现TextBox的onChange事件让DataGrid捕获,那就需要事件提升,现在有2种解决方案第一种,重写TextBox控件
前台代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

后台代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

110

111

118

119

132

133

134

135

136

137

这样就可以实现捕获了,现在我们用第2种方法来实现
前台代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

后台代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

2种方法都实现了。代码很简单。我就不讲解了.
完整的代码下载
https://files.cnblogs.com/mextb1860/WebSite2.zip