I have worked on a similar application but my Table structure was different. It had "answerID", "questionId", "answerText" and "isCorrect" columns. So I used to pass "questionId" as variable and it fetched all the answers for the selected question. This was a better solution as a question can have 2, 3 or 4 options. In your case the resultset returned by your query is going to give you only a single row and you are binding the data to radiobuttonlist with only single row. So it will always give you answer 1. You can change the structure of your table or modify your code if you are sure that there are exactly 4 answers for every question. Try:
string q = "SELECT Ans1,Ans2,Ans3,Ans4 from TestQuestion where QId=" + QID;
cmd = new SqlCommand(q, con);
cmd.Connection.Open();
SqlDataAdapter da = new SqlDataAdapter(q, con);
DataSet ds = new DataSet();
da.Fill(ds);
DataTable dt = ds.Tables[0];
DataTable dtRecords = new DataTable();
dtRecords.Columns.Add("answer",typeof("string"));
dtRecords.Rows.Add(dt.Rows[0][0].ToString().Trim());
dtRecords.Rows.Add(dt.Rows[0][1].ToString().Trim());
dtRecords.Rows.Add(dt.Rows[0][2].ToString().Trim());
dtRecords.Rows.Add(dt.Rows[0][3].ToString().Trim());
RadioButtonList1.DataSource = dtRecords;
RadioButtonList1ataTextField = dtRecords.Columns[0].ToString();
RadioButtonList1.DataValueField = dtRecords.Columns[0].ToString();
RadioButtonList1.DataBind();
But this is just a workaround. You should modify your table structure and make it more generic.