У меня есть таблица Documents и GridView, в которой я отображаю некоторую информацию. Внутри ItemTemplate я поместил кнопки в качестве рейтинговой системы. Что я хочу сделать, так это получить DocumentID из таблицы Documents и использовать его в качестве идентификатора в таблице RatingTable с DocumentID в качестве первичного и внешнего ключа и рейтингом как tinyint.
Вот код для gridview:
<asp:GridView ID="SearchView" runat="server" AutoGenerateColumns="false" OnSelectedIndexChanged="SearchView_SelectedIndexChanged" ShowHeaderWhenEmpty="true" EmptyDataText="Ingen oppføringer">
<Columns>
<asp:BoundField DataField="FileName" HeaderText="Filnavn" />
<asp:BoundField DataField="ReportCount" HeaderText="Antall rapporteringer" />
<asp:BoundField DataField="Tags" HeaderText="Tags" />
<asp:BoundField DataField="CourseCode" HeaderText="Fagkode" />
<asp:TemplateField HeaderText="Rating">
<ItemTemplate>
<asp:ImageButton class="myButtonLink" ImageUrl="~/Images/empty_star.png" ID="rate1" runat="server" OnClick="rate1_Click"/>
<asp:ImageButton class="myButtonLink" ImageUrl="~/Images/empty_star.png" ID="rate2" runat="server" OnClick="rate2_Click"/>
<asp:ImageButton class="myButtonLink" ImageUrl="~/Images/empty_star.png" ID="rate3" runat="server" OnClick="rate3_Click"/>
<asp:ImageButton class="myButtonLink" ImageUrl="~/Images/empty_star.png" ID="rate4" runat="server" OnClick="rate4_Click"/>
<asp:ImageButton class="myButtonLink" ImageUrl="~/Images/empty_star.png" ID="rate5" runat="server" OnClick="rate5_Click"/>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField ItemStyle-HorizontalAlign="Center" HeaderText="Nedlastingslink">
<ItemTemplate>
<asp:LinkButton ID="downloadbutton" runat="server" Text="Last ned" OnClick="Download_Click"
CommandArgument='<%# Eval("FileName") %>'></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField ItemStyle-HorizontalAlign="Center" HeaderText="Rapporter" ItemStyle-Font-Size="Small">
<ItemTemplate>
<asp:LinkButton ID="reportbutton" runat="server" Text="Rapporter dokument" OnClick="Report_Click"></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
Вот код, в котором я пытаюсь вставить значение рейтинга в RatingTable:
protected void updaterating(int rating)
{
//string value = SearchView.SelectedDataKey.Value.ToString();
using (SqlConnection con = new SqlConnection(connectionstring))
{
using (SqlCommand cmd = new SqlCommand("INSERT INTO RatingTable (DocumentID, Rating) VALUES(@DocumentID, @Rating)"))
{
using (SqlDataAdapter sda = new SqlDataAdapter())
{
cmd.CommandType = CommandType.Text;
//cmd.Parameters.AddWithValue("@DocumentID", value);
cmd.Parameters.AddWithValue("@Rating", rating);
cmd.Connection = con;
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
}
}
Response.Redirect(Request.Url.AbsoluteUri);
}
protected void rate1_Click(object sender, ImageClickEventArgs e)
{
updaterating(1);
}
protected void rate2_Click(object sender, ImageClickEventArgs e)
{
updaterating(2);
}
protected void rate3_Click(object sender, ImageClickEventArgs e)
{
updaterating(3);
}
protected void rate4_Click(object sender, ImageClickEventArgs e)
{
updaterating(4);
}
protected void rate5_Click(object sender, ImageClickEventArgs e)
{
updaterating(5);
}
Вот что нравится инструментам RatingTable:
[RatingTable] (
[DocumentID] INT NOT NULL,
[Rating] TINYINT NOT NULL,
PRIMARY KEY CLUSTERED ([DocumentID] ASC),
CONSTRAINT [FK_RatingTable_Documents] FOREIGN KEY ([DocumentID]) REFERENCES [dbo].[Documents] ([DocumentId])
);
Что я пытаюсь сделать, так это когда я нажимаю одну из кнопок ImageButtons в поле TemplateField «Рейтинг», я хочу, чтобы он получил текущий DocumentID для строки, в которой я нахожусь, и использовал это, чтобы вставить его в RatingTable в качестве основного ключ со значением нажатой звезды. В функции обновления в приведенном ниже коде я закомментировал несколько строк, в которых я пытался использовать DataKeyNames в GridView для получения идентификатора, но это дает пустой GridView.
if (!IsPostBack)
{
SearchView.DataKeyNames = new string[]{"DocumentID"};
BindGrid();
}
Я добавил это, чтобы попытаться получить DataKeyNames прямо перед привязкой сетки, но GridView все еще пуст.
Я также изменил строковое значение, потому что использовал неправильный атрибут:
protected void updaterating(int rating)
{
string value = SearchView.DataKeyNames.ToString();
using (SqlConnection con = new SqlConnection(connectionstring))
{
using (SqlCommand cmd = new SqlCommand("INSERT INTO RatingTable (DocumentID, Rating) VALUES(@DocumentID, @Rating)"))
{
using (SqlDataAdapter sda = new SqlDataAdapter())
{
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@DocumentID", value);
cmd.Parameters.AddWithValue("@Rating", rating);
cmd.Connection = con;
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
}
}
Response.Redirect(Request.Url.AbsoluteUri);
}
Любая помощь высоко ценится!