У меня есть GridView, и мне нужно, чтобы две вещи происходили, когда пользователь щелкает строку: 1. Создание другого gridview. 2. Обновление изображения в первом GridView.
Вот мой первый GridView:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
Height="271px" onselectedindexchanged="GridView1_SelectedIndexChanged"
style="font-family: Arial, Helvetica, sans-serif; text-align: center;"
Width="452px" DataKeyNames="messageCode"
onrowdatabound="GridView1_RowDataBound">
<Columns>
<asp:BoundField DataField="date" DataFormatString="{0:d}" HeaderText="date" />
<asp:BoundField DataField="messageSubject" HeaderText="subject" />
<asp:TemplateField>
<ItemTemplate>
<asp:Image runat="server" ID="img" />
</ItemTemplate>
</asp:TemplateField>
<asp:CommandField HeaderText="show message" ShowSelectButton="True" />
</Columns>
</asp:GridView>
И это другой GridView:
<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False"
Height="102px"
style="font-family: Arial, Helvetica, sans-serif; text-align: center"
Visible="False" Width="345px">
<Columns>
<asp:BoundField DataField="messageContent" HeaderText="content" />
</Columns>
</asp:GridView>
Мой код позади:
public partial class WebMessages : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Page.MaintainScrollPositionOnPostBack = true;
if (!IsPostBack)
{
GridView2.Visible = false;
WebServiceDBMessages.WebServiceDBMessagesSoapClient dbm = new WebServiceDBMessages.WebServiceDBMessagesSoapClient();
DataTable dt = dbm.ReturnAllMessagesForTeacher(Session["teacher"].ToString()).Tables[0];
GridView1.DataSource = dt;
GridView1.DataBind();
//build the first GridView which shows to the user: date, message subject, image (if the message was read or not) and select field.
}
}
protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
WebServiceDBMessages.WebServiceDBMessagesSoapClient dbm = new WebServiceDBMessages.WebServiceDBMessagesSoapClient();
GridView2.Visible = true;
int messageCode = int.Parse(GridView1.SelectedDataKey.Value.ToString());
DataTable dt = dbm.ReturnContentByCode(messageCode).Tables[0];
GridView2.DataSource = dt;
GridView2.DataBind();
dbm.UpdateStatusToRead(messageCode);//The Database field update occurs here, but the image update only occurs in the GridView1_RowDataBound function.
//build the second GridView which shows to the user the message content.
}
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
//DBMessages dbm=new DBMessages();
WebServiceDBMessages.WebServiceDBMessagesSoapClient dbm = new WebServiceDBMessages.WebServiceDBMessagesSoapClient();
string wasReadOrNot = dbm.ReturnIfWasRead(e.Row.Cells[1].Text);
var image = e.Row.FindControl("img") as System.Web.UI.WebControls.Image;
image.Width = 80;
image.Height = 60;
image.ImageUrl = wasReadOrNot == "not read" ? "/images/notRead.png" : "/images/read.png";
GridView2.Visible = true;
}
//At the first loading of the page it shows the image in accordance with the field "wasReadOrNot" found in the Database.
//I want this function to happen again after selecting a row in the first GridView.
}
}
Как я могу вызвать функцию GridView1_RowDataBound в функции GridView1_SelectedIndexChanged? Или какие-то другие идеи могут решить мою проблему? Я пробовал и другие вещи, но во всех них происходит только одно - появляется второй GridView, но изображение не обновляется, или наоборот. Спасибо (: