Fir DataList you have to replace the OnRatingChanged function as Below
protected void OnRatingChanged(object sender, RatingEventArgs e)
{
int rowIndex = ((sender as Rating).NamingContainer as DataListItem).ItemIndex;
int fruitId = Convert.ToInt32(DataList1.DataKeys[rowIndex].ToString());
string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
using (SqlConnection con = new SqlConnection(constr))
{
using (SqlCommand cmd = new SqlCommand("INSERT INTO FruitRatings VALUES(@FruitId, @Rating)"))
{
using (SqlDataAdapter sda = new SqlDataAdapter())
{
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@FruitId", fruitId);
cmd.Parameters.AddWithValue("@Rating", e.Value);
cmd.Connection = con;
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
}
}
Response.Redirect(Request.Url.AbsoluteUri);
}
DataList:
<asp:DataList ID="DataList1" runat="server" DataKeyField="FruitId">
<ItemTemplate>
<br />
<table cellpadding="5px" cellspacing="0" class="td th">
<tr>
<td style="max-width: 200px;">
<asp:Label Text='<%# Eval("FruitName") %>' runat="server" />
</td>
<td style="max-width: 500px;">
<cc1:Rating ID="Rating1" AutoPostBack="true" OnChanged="OnRatingChanged" runat="server"
StarCssClass="Star" WaitingStarCssClass="WaitingStar" EmptyStarCssClass="Star"
FilledStarCssClass="FilledStar" CurrentRating='<%# Eval("Rating") %>'>
</cc1:Rating>
</td>
</tr>
</table>
<br />
</ItemTemplate>
</asp:DataList>
This is how i have design my DataList you can have Table or dont have it depends on your way of displaying.
Ref:Using ASP.Net AJAX Rating Control inside GridView TemplateField ItemTemplate
Thank You.