You need to loop through each row. Then inside the row loop through the columns and calculate the max mark.
Refer below example.
HTML
<asp:GridView ID="GridviewMaxmarks" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField HeaderText="Id" DataField="Id" />
<asp:BoundField HeaderText="Candidate_Name" DataField="Candidate_Name" />
<asp:TemplateField HeaderText="Q1">
<ItemTemplate>
<asp:TextBox ID="txtQ1" Text='<%# Eval("Q1") %>' Width="40px" runat="server" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Q2">
<ItemTemplate>
<asp:TextBox ID="txtQ2" Text='<%# Eval("Q2") %>' Width="40px" runat="server" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Q3">
<ItemTemplate>
<asp:TextBox ID="txtQ3" Text='<%# Eval("Q3") %>' Width="40px" runat="server" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
Code
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
DataTable dt2 = new DataTable();
dt2.Columns.AddRange(new DataColumn[] {
new DataColumn("Id", typeof(int)),
new DataColumn("Candidate_Name"),
new DataColumn("Q1", typeof(int)),
new DataColumn("Q2", typeof(int)),
new DataColumn("Q3", typeof(int))
});
dt2.Rows.Add(1, "Aarush Sharma", 1, 2, 3);
dt2.Rows.Add(2, "Akshit Rana", 6, 4, 5);
dt2.Rows.Add(3, "Anhad Singh", 5, 9, 4);
this.GridviewMaxmarks.DataSource = dt2;
this.GridviewMaxmarks.DataBind();
}
}
protected void btnsave_Click(object sender, EventArgs e)
{
List<MarkDetails> details = new List<MarkDetails>();
foreach (GridViewRow row in GridviewMaxmarks.Rows)
{
MarkDetails detail = new MarkDetails();
detail.Id = Convert.ToInt32(row.Cells[0].Text);
detail.Name = row.Cells[1].Text;
List<int> marks = new List<int>();
for (int i = 2; i < row.Cells.Count; i++)
{
marks.Add(Convert.ToInt32((row.Cells[i].Controls[1] as TextBox).Text));
}
detail.Mark = marks.Max();
details.Add(detail);
}
}
public class MarkDetails
{
public int Id { get; set; }
public string Name { get; set; }
public int Mark { get; set; }
}