Как обновить GridView после установки флажка и нажатия кнопки сохранения?
Мне нужно установить эти GridView для обновления администратором. Так как у меня много сотрудников и много курсов в каждом GridView, я думаю, что лучший способ обновить GridView - показать пустые поля в виде флажков, и когда администратор хочет обновить запись одного из сотрудников, все ему нужно только установить флажки и нажать кнопку обновления. Я мог бы показывать пустые поля в виде флажков, но теперь я не знаю, как отправить значение флажка в базу данных.
Сценарий, который я ищу, состоит в том, чтобы система проверяла каждый флажок в каждом GridView, если он уже был проверен, оставьте его как есть. Если он был пуст и теперь только проверяется, его следует добавить в базу данных в записи сотрудника. Поэтому GridView будет обновлен нажатием кнопки сохранения. Мой оригинальный код:
<asp:Repeater ID="Repeater1" runat="server" DataSourceID="SqlDataSource1">
<ItemTemplate>
<asp:HiddenField ID="HiddenField1" runat="server" Value='<%# Eval("GroupID")%>' />
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:testConnectionString %>"
SelectCommandType="StoredProcedure" SelectCommand="kbiReport">
<%--FilterExpression="[Division] like '{0}%' and [Organization] like '{1}%'">--%>
<%--<FilterParameters>
<asp:ControlParameter ControlID="ddlDivision" Name="Division"
PropertyName="SelectedValue" Type="String" />
<asp:ControlParameter ControlID="ddlOrganization" Name="Organization"
PropertyName="SelectedValue" Type="String" />
</FilterParameters>--%>
<SelectParameters>
<%--ControlParameter is linked to the HiddenField above to generate different GridView based on different values
of GroupID--%>
<asp:ControlParameter ControlID="HiddenField1" Name="GroupID" PropertyName="Value" />
</SelectParameters>
</asp:SqlDataSource>
<asp:GridView ID="GridView1" runat="server"
AllowSorting="True"
CellPadding="3"
DataSourceID="SqlDataSource1"
CssClass="mGrid"
AlternatingRowStyle-CssClass="alt"
RowStyle-HorizontalAlign="Center"
OnRowDataBound="GridView1_RowDataBound" OnDataBound="GridView1_DataBound">
<AlternatingRowStyle BackColor="White" ForeColor="#284775" />
<HeaderStyle Font-Bold = "true" ForeColor="Black"/>
<Columns>
<asp:CommandField ShowSelectButton="True" />
<%--<asp:TemplateField HeaderText="Select">
<ItemTemplate>
<asp:CheckBox ID="chkSelect" runat="server" AutoPostBack="true" OnCheckedChanged="chkSelect_CheckedChanged"/>
</ItemTemplate>
</asp:TemplateField>--%>
</Columns>
<EditRowStyle BackColor="#999999" />
<FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
<PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
<RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
<SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
<SortedAscendingCellStyle BackColor="#E9E7E2" />
<SortedAscendingHeaderStyle BackColor="#506C8C" />
<SortedDescendingCellStyle BackColor="#FFFDF8" />
<SortedDescendingHeaderStyle BackColor="#6F8DAE" />
</asp:GridView>
</ItemTemplate>
</asp:Repeater>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:testConnectionString %>"
SelectCommand="SELECT DISTINCT GroupID FROM courses">
</asp:SqlDataSource>
<asp:Button ID="btnSave" runat="server" OnClick="btnSave_Click" Text="Save" />
<br /><br />
Код позади:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
foreach (TableCell c in e.Row.Cells)
{
// Check if the cell vlaue = Yes
// if it is Yes, the cell will be colored with Light Green
if (c.Text.Equals("Yes"))
{
c.BackColor = System.Drawing.Color.LightGreen;
}
}
}
// The following is for changing the color of headers in each GridView based on the value of the HiddenFild
// BTW, the value of the HiddenField is the value of the GroupID in Group Table in the Database
else if(e.Row.RowType == DataControlRowType.Header){
switch (((HiddenField)((GridView)sender).Parent.FindControl("HiddenField1")).Value)
{
case "1":
for (int i = 5; i < e.Row.Cells.Count; i++)
e.Row.Cells[i].BackColor = System.Drawing.Color.LightBlue;
break;
case "2":
for (int i = 5; i < e.Row.Cells.Count; i++)
e.Row.Cells[i].BackColor = System.Drawing.Color.LightYellow;
break;
case "3":
for (int i = 5; i < e.Row.Cells.Count; i++)
e.Row.Cells[i].BackColor = System.Drawing.Color.Orange;
break;
}
}}
//For inserting checkboxes inside all courses buttons
protected void GridView1_DataBound(object sender, EventArgs e){
GridView GridView1 = (GridView)sender;
foreach (GridViewRow objRow in GridView1.Rows)
{
for (int i = 5; i < objRow.Cells.Count; i++){
CheckBox chkCheckBox = new CheckBox();
objRow.Cells[i].Controls.Add(chkCheckBox);
if (objRow.Cells[i].BackColor == System.Drawing.Color.LightGreen)
chkCheckBox.Checked = true;
}
}
}
//For updating the GridView (Save Button)
protected void btnSave_Click(object sender, EventArgs e)
{
}
ОБНОВЛЕНИЕ: я изменил кнопку btnSave_Click, чтобы быть следующим:
//For updating the GridView (Save Button)
protected void btnSave_Click(object sender, EventArgs e)
{
GridView GridView1 = (GridView)sender;
// Are there checked boxes?
List<int> CheckBoxList = new List<int>();
for (int i = 0; i < GridView1.Rows.Count; i++)
{
int courseid = (int)GridView1.DataKeys[i][0];
CheckBox checkBox = (CheckBox)GridView1.Rows[i].FindControl("CheckBox");
if (checkBox.Checked)
{
CheckBoxList.Add(courseid);
}
}
}
Но я получил следующую ошибку:Sys.WebForms.PageRequestManagerServerErrorException: Невозможно привести объект типа 'System.Web.UI.WebControls.Button' к типу 'System.Web.UI.WebControls.GridView'
Я не знаю, почему я получил эту ошибку. Может ли кто-нибудь помочь мне с этим?
3 ответа
protected void btnSaveRankChanges_Click(object sender, EventArgs e)
{
foreach (GridViewRow grv in GridViewRankChanges.Rows)
{
CheckBox changeRankCheck = (CheckBox)grv.Cells[0].FindControl("CheckBoxRankChange");
if (changeRankCheck != null && changeRankCheck.Checked == true)
{
//Do your work for selected checkbox
}
}
}
Надеюсь, поможет.
Неверный актерский состав в btnSave_Click
, sender
Переменная имеет ссылку на объект Button. Вы должны использовать Repeater.Items
Коллекция для доступа к GridView
объект.
Ваш код должен быть:
protected void btnSave_Click(object sender, EventArgs e)
{
for(int i=0;i<Repeater1.Items.Count;i++)
{
GridView GridView1 = (GridView)Repeater1.Items[i].FindControl("GridView1");
List<int> CheckBoxList = new List<int>();
for (int i = 0; i < GridView1.Rows.Count; i++)
{
int courseid = (int)GridView1.DataKeys[i][0];
CheckBox checkBox = (CheckBox)GridView1.Rows[i].FindControl("CheckBox");
if (checkBox.Checked)
{
CheckBoxList.Add(courseid);
}
}
}
}
В Visual Basic .net мы часто использовали цикл просмотра сетки. например
Privtae Sub Button1_Click(sender As Object, e As System.EventArgs)
Dim rows as gridviewrows
For Each rows in gridview1.rows
dim chkbox as new checkbox
'since we find specific control with unique id so we use to find that control by
'using the method FindControl
chkbox = rows.findcontrol("chkInGridview")
if chkbox.checked then
'your code goes here
else
'your code goes here
end if
Next
End Sub
P / S:
Вы решаете это разными способами. Вы можете попробовать использовать вложенный grid view.