It can look something like this:
Example
<%@ Page Language="C#" %>
<%@ Register Assembly="Ext.Net" Namespace="Ext.Net" TagPrefix="ext" %>
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
if (!X.IsAjaxRequest)
{
Store store = this.GridPanel1.GetStore();
store.DataSource = new object[] {
new object[] {"id1", "test11", "test12"},
new object[] {"id2", "test12", "test22"},
new object[] {"id3", "test31", "test32"}
};
store.DataBind();
}
}
protected void Command(object sender, DirectEventArgs e)
{
X.Msg.Alert("DirectEvent", "Hello!<br/>The record is " + Hidden1.Value.ToString()).Show();
}
</script>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Ext.Net Example</title>
<script type="text/javascript">
var myCommand = function(a) {
Hidden1.setValue(Ext.encode(GridPanel1.getStore().getById(a.id).data));
Button1.fireEvent('click');
}
</script>
</head>
<body>
<form runat="server">
<ext:ResourceManager runat="server" />
<ext:GridPanel ID="GridPanel1" runat="server" AutoHeight="true">
<Store>
<ext:Store runat="server">
<Reader>
<ext:ArrayReader IDProperty="id">
<Fields>
<ext:RecordField Name="id" />
<ext:RecordField Name="test1" />
<ext:RecordField Name="test2" />
</Fields>
</ext:ArrayReader>
</Reader>
</ext:Store>
</Store>
<ColumnModel runat="server">
<Columns>
<ext:Column Header="ID" DataIndex="id" />
<ext:Column Header="Test1" DataIndex="test1" />
<ext:TemplateColumn Header="Test2" DataIndex="test2">
<Template>
<Html>
<a id="{id}" href="#" onclick="myCommand(this)">{test2}</a>
</Html>
</Template>
</ext:TemplateColumn>
</Columns>
</ColumnModel>
</ext:GridPanel>
<ext:Button ID="Button1" runat="server" Text="DirectEvent" Hidden="true">
<DirectEvents>
<Click OnEvent="Command" />
</DirectEvents>
</ext:Button>
<ext:Hidden ID="Hidden1" runat="server" />
</form>
</body>
</html>
On server side you can use the JSON.Deserialize() method.