(原創) 如何獲得GridView內LinkButton的RowIndex? (.NET) (ASP.NET)
Abstract
在.NET 1.x的DataGrid,可以在ItemCommand event的e.Item.ItemIndex獲得目前的RowIndex,但在.NET 2.0的GridView,卻無法使用這種方式在RowCommand event獲得RowIndex。
Motivation
為什麼需要在RowCommand event獲得RowIndex呢?通常一個Table的PK或FK並不會顯示在GridView上,而會設定在DataKeyNames property,然後再RowCommand event根據RowIndex讀出該row的PK或FK,所以第一步,必須先能在RowCommand獲得目前的RowIndex。
Introduction
.NET 1.x DataGrid
在.NET 1.x的DataGrid,若要使用LinkButton,一樣得放在TemplateColumn內,且ItemCommand event的e.Item.ItemIndex就可抓到RowIndex。
當在DataGrid點下FirstName後,會在下方的Label顯示LastName,LastName是此例的DataKey。

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

51行

2

3

4

5

只需在ItemCommand event的e.Item.ItemIndex就可以輕鬆的抓到RowIndex。
.NET 2.0 GridView
.NET 2.0就改用SqlDataSource和GridView了,LinkButtom一樣得放在TemplateField,但GridView沒有ItemCommand event,取而代之的是RowCommand event。

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

最難理解的應該是32行

e.CommandSource傳的是按下去的LinkButton,不過由於傳回的是Object,就得自行轉成LinkButton,但由於我們想知道的是RowIndex,而LinkButton是包含在GridViewRow內,所以透過NamingContainer傳回目前的GridViewRow,但傳回的是Control,所以需在轉成GridViewRow後才能有RowIndex property。
Conclusion
GridView是DataGrid的繼承人,但不少寫法和DataGrid並不一樣,GridView很多地方比DataGrid更強更好用,但這個例子卻發現GridView比DataGrid麻煩些,或許我沒找到好最好的方法,若有人有更好的方式,歡迎指正,謝謝。