PDA

View Full Version : حذف سطر هایی که با Chkbox مشخص شده



mp2009
چهارشنبه 28 شهریور 1386, 23:29 عصر
سلام به تمامی کاربران محترم سایت
من یه دونه گرید ویو دارم که یکی از سطونهاش چک باکس هست
میخواهم کاربر هر سطی رو که تیک زد حذف کنه


این کد من هست



CheckBox chkRemove=newCheckBox();
DataBoundLiteralControl DBLC;
string strIDs= "";
bool boolCheck= false;
foreach (GridViewRow gvRow in GridView_NewsList.Rows)
{
chkRemove = (CheckBox)GridView_NewsList.FindControl("ChkRemove");
if (chkRemove.Checked == true)
{
boolCheck = true;

DBLC = (DataBoundLiteralControl)GridView_NewsList.FindCon trol("ItemNumRemove").Controls[0];
strIDs += DBLC.Text + ",";

}
}
if (boolCheck == true)
{

string strSQL = "Delete * From news Where Id IN ('" + strIDs.Substring(0, strIDs.LastIndexOf(",")) + "')";
SqlConnection con = newSqlConnection(st);
SqlCommand cmd = newSqlCommand(strSQL,con);

try
{
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
catch (SqlException ex)
{
Response.Write(ex.Message.ToString());
}
finally
{

}
}


اینم کد گرید ویو



<asp:GridViewID="GridView_NewsList"runat="server"AutoGenerateColumns="False"DataKeyNames="Id"
DataSourceID="SqlDataSource1"Font-Names="Tahoma"Font-Size="9pt"Font-Strikeout="False"
Width="732px"OnSelectedIndexChanged="GridView_NewsList_SelectedIndexChanged"OnRowDataBound="GridView_NewsList_RowDataBound"EmptyDataText="چیزی برای نمایش وجود ندارد"AllowPaging="True"OnRowDeleting="GridView_NewsList_RowDeleting"ShowFooter="True">
<FooterStyleBackColor="Wheat"/>
<EmptyDataRowStyleBackColor="SteelBlue"Wrap="True"/>
<Columns>
<asp:TemplateField>
<FooterTemplate>
<asp:ButtonID="btnRemove"runat="server"BackColor="#FFC080"BorderStyle="Solid"
BorderWidth="1px"CommandName="delete"Font-Names="Tahoma"Font-Size="11px"Height="22px"
Text="حذف"Width="64px"/>
</FooterTemplate>
<ItemTemplate>
<asp:CheckBoxID="ChkRemove"runat="server"/>
</ItemTemplate>
</asp:TemplateField>
<asp:CommandFieldButtonType="Button"DeleteText="حذف خبر"SelectText="ویرایش"ShowSelectButton="True"UpdateText="save">
<ItemStyleBorderWidth="1px"/>
<ControlStyleBackColor="Gainsboro"BorderColor="#404040"BorderWidth="1px"/>
</asp:CommandField>
<asp:BoundFieldDataField="Username"HeaderText="نویسنده"SortExpression="Username"/>
<asp:BoundFieldDataField="Time"HeaderText="ساعت درج"SortExpression="Time">
<ItemStyleWidth="100px"/>
</asp:BoundField>
<asp:BoundFieldDataField="Date"HeaderText="تاریخ"SortExpression="Date"/>
<asp:TemplateFieldFooterText="خلاصه خبر"HeaderText="خلاصه خبر"SortExpression="Body">
<ItemStyleWidth="150px"/>
<ItemTemplate>
&nbsp;<asp:PanelID="Panel2"runat="server"Height="50px"ScrollBars="Vertical"Width="221px">
<asp:LabelID="Label1"runat="server"Text='<%# Eval("Body") %>'></asp:Label></asp:Panel>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateFieldFooterText="عنوان"HeaderText="عنوان">
<ItemStyleWidth="130px"/>
<ItemTemplate>
&nbsp;&nbsp;
<asp:LabelID="Label5"runat="server"Text='<%# Eval("Title") %>'></asp:Label>&nbsp;
</ItemTemplate>
<AlternatingItemTemplate>
&nbsp;
</AlternatingItemTemplate>
</asp:TemplateField>
<asp:BoundFieldDataField="Id"HeaderText="کد خبر"InsertVisible="False"ReadOnly="True"
SortExpression="Id">
<ItemStyleWidth="35px"/>
</asp:BoundField>
<asp:TemplateField>
<ItemTemplate>
<asp:LabelID="ItemNumRemove"runat="server"Visible="False"Text='<%# Eval("Id") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<RowStyleBackColor="InactiveCaptionText"/>
<EditRowStyleBackColor="CornflowerBlue"/>
<SelectedRowStyleBackColor="PeachPuff"/>
<HeaderStyleBackColor="Wheat"Font-Names="Arial"Font-Size="Medium"ForeColor="#400000"/>
</asp:GridView>


وقتی اجرا میکنم این ارور رو میده




Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index




فکر کنم از این خط erorr میده



foreach (GridViewRow gvRow in GridView_NewsList.Rows)
{
chkRemove = (CheckBox)GridView_NewsList.FindControl("ChkRemove");

abadanboy
پنج شنبه 29 شهریور 1386, 08:52 صبح
این کد یه دکمه جدا داره منظورم خارج گرید ویو و تو آن کلیک دکمه حذف ببین چی نوشته حتماً عمل می کنه
موفق باشی

asp

<td style="width: 100px">
<asp:Button ID="BtnDel" runat="server" Text="حذف" OnClick="BtnDel_Click" />
<asp:HiddenField ID="h1" runat="server" />
</td>
<td style="width: 100px; text-align: right; border-left-color: #ffffc5; border-bottom-color: #ffffc5; border-top-style: dotted; border-top-color: #ffffc5; border-right-style: dotted; border-left-style: dotted; border-right-color: #ffffc5; border-bottom-style: dotted;">
<asp:datagrid id="DataGrid1" runat="server" Font-Names="Tahoma" Font-Size="X-Small" HorizontalAlign="Center" Width="290px" BackColor="White" BorderColor="#CCCCCC" CellPadding="3" BorderWidth="1px" BorderStyle="None" AutoGenerateColumns="False" AllowPaging="True">
<SelectedItemStyle Font-Bold="True" ForeColor="White" BackColor="#669999"></SelectedItemStyle>
<ItemStyle HorizontalAlign="Right" ForeColor="#000066" VerticalAlign="Middle"></ItemStyle>
<HeaderStyle Font-Bold="True" HorizontalAlign="Center" ForeColor="White" VerticalAlign="Middle"
BackColor="#006699"></HeaderStyle>
<FooterStyle ForeColor="#000066" BackColor="White"></FooterStyle>
<Columns>
<asp:BoundColumn DataField="NewsTitle" HeaderText="عنوان خبر">
<HeaderStyle Width="200px"></HeaderStyle>
</asp:BoundColumn>
<asp:TemplateColumn HeaderText="ویرایش">
<HeaderStyle Width="40px"></HeaderStyle>
<ItemStyle HorizontalAlign="Center"></ItemStyle>
<ItemTemplate>
<asp:ImageButton id=ImageButton1 runat="server" ImageUrl="..\images\Edit.gif" CommandName="cmd" CommandArgument='<%# DataBinder.Eval(Container, "DataItem.NewsId") %>'>
</asp:ImageButton>
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="حذف">
<HeaderStyle Width="30px"></HeaderStyle>
<ItemTemplate>
<asp:CheckBox id="CheckBox1" runat="server"></asp:CheckBox>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
<PagerStyle VerticalAlign="Middle" Font-Underline="True" HorizontalAlign="Left" ForeColor="#000066"
BackColor="White" Mode="NumericPages"></PagerStyle>
</asp:datagrid></td>

#C


//Por Kardane DataGrid
void Dgrid()
{
try
{
SqlDataAdapter da = new SqlDataAdapter("Select NewsId,NewsTitle From TblNews order by NewsID desc", cn);
DataSet ds = new DataSet();
da.Fill(ds, "Tbl");
DataGrid1.DataSource = ds.Tables["Tbl"].DefaultView;
DataGrid1.DataKeyField = "NewsID";
DataGrid1.DataBind();
}
catch { }

}
// hazfe record
protected void BtnDel_Click(object sender, EventArgs e)
{
StringBuilder strB = new StringBuilder();
foreach (DataGridItem i in DataGrid1.Items)
{
CheckBox cb = (CheckBox)i.Cells[2].Controls[1];
if (cb.Checked)
{
strB.Append(DataGrid1.DataKeys[i.ItemIndex].ToString());
// strB.Append(" ");
}
}
cmd.CommandText = "DELETE from TblNews Where (CHARINDEX (LTRIM (STR (newsId ) ), @NewsId)>0)";
cmd.Parameters.Add("@NewsId", SqlDbType.Int);
cmd.Parameters["@NewsId"].Value = strB.ToString();
cn.Open();
cmd.ExecuteNonQuery();
cn.Close();
Dgrid();
}

mp2009
پنج شنبه 29 شهریور 1386, 10:26 صبح
این کدی که شما نوشتید برای dotnet 1.1 هست اگه میشه به دات نت 2 تبدیلش کنید
دز ضمن من این کد رو دارم
مرسی

mp2009
پنج شنبه 29 شهریور 1386, 22:58 عصر
اقا کسی چرا این مشکل رو رفع نمیکنه؟
البته نمیخواهم گرید دیگه ای بسازم میخواهم کد روی همین گرید کار کنه
help me

mp2009
جمعه 30 شهریور 1386, 13:41 عصر
سلام
از جناب abadanboy (http://barnamenevis.org/forum/member.php?u=45359) vbmenu_register("postmenu_397545", true); کمال تشکر را دارم
مشکلم رو توی سایت code project حل کردم اینم کد
protected void btnRemove_Click(object sender, EventArgs e)
{
string gvIDs = "";
bool chkBox = false;

foreach (GridViewRow gv in GridView_NewsList.Rows)
{
CheckBox deleteChkBxItem = (CheckBox)gv.FindControl("ChkRemove");
if (deleteChkBxItem.Checked)
{
chkBox = true;

gvIDs += ((Label)gv.FindControl("Lbl_id")).Text.ToString() + ",";
}
}
SqlConnection con = new SqlConnection(st);
if (chkBox)
{

try
{
string deleteSQL = "DELETE from news WHERE id IN (" +
gvIDs.Substring(0, gvIDs.LastIndexOf(",")) + ")";
SqlCommand cmd = new SqlCommand(deleteSQL, con);
con.Open();
cmd.ExecuteNonQuery();
GridView_NewsList.DataBind();
}
catch (SqlException err)
{
Response.Write(err.Message.ToString());
}
finally
{
con.Close();
}
}

Ehsan Valinouri
یک شنبه 15 مهر 1386, 13:49 عصر
با سلام.منم مشکلم تا حدی مشابه شماست.لابته مال من هنوز حل نشده.
من یه gridview دارم که DataSource اون Membership.GetAllUsers است.تمام فیلد ها هم Template کار کردم.یه Checkbox هم توی Grid قرار دادم که هروقت چک شده باشه با زدن دکمه خذف که خارج از Grid قرارش دادم تابع Membership.DeleteUser(Username) اجرا میشه.

کد گرید ویو:

<asp:GridView ID="grdUsers" runat="server" Style="position: static" Width="100%" AutoGenerateColumns="False" AllowPaging="True">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<div style="text-align: center">
<table style="width: 100%; position: static">
<tr>
<td style="width: 100%; background-color: whitesmoke; text-align: right">
<asp:CheckBox ID="chkRemove" runat="server" Font-Names="Tahoma" Font-Size="8pt" Style="position: static"
Text="حذف" /></td>
</tr>
</table>
<table style="width: 100%; position: static">
<tr>
<td style="width: 50%; background-color: ghostwhite">
<asp:Label ID="Label1" runat="server" Font-Names="Tahoma" Font-Size="8pt" ForeColor="Green"
Style="position: static" Text="نام کاربری:"></asp:Label>
<asp:Label ID="lblUserName"
runat="server" Font-Names="Tahoma" Font-Size="8pt" Style="position: static" Text='<%# eval("username") %>' ForeColor="Navy"></asp:Label></td>
<td style="width: 50%; background-color: aliceblue">
<asp:Label ID="Label2" runat="server" Font-Names="Tahoma" Font-Size="8pt" ForeColor="Green"
Style="position: static" Text="ایمیل:"></asp:Label>
<asp:Label ID="lblEmail" runat="server" Font-Names="Tahoma" Font-Size="8pt" Style="position: static"
Text='<%# eval("Email") %>' ForeColor="Navy"></asp:Label></td>
</tr>
<tr>
<td style="width: 50%; background-color: ghostwhite">
<asp:Label ID="Label3" runat="server" Font-Names="Tahoma" Font-Size="8pt" ForeColor="Green"
Style="position: static" Text="تاریخ عضویت:"></asp:Label>
<asp:Label ID="lblCreateDate"
runat="server" Font-Names="Tahoma" Font-Size="8pt" Style="position: static" Text='<%# eval("CreationDate") %>' ForeColor="Navy"></asp:Label></td>
<td style="width: 50%; background-color: aliceblue" unselectable="on">
<asp:Label ID="Label5" runat="server" Font-Names="Tahoma" Font-Size="8pt" ForeColor="Green"
Style="position: static" Text="آخرین لاگین:"></asp:Label><asp:Label ID="lblLastLogin" runat="server" Font-Names="Tahoma" Font-Size="8pt" ForeColor="Navy"
Style="position: static" Text='<%# eval("LastLoginDate") %>'></asp:Label></td>
</tr>
<tr>
<td style="width: 50%; background-color: ghostwhite">
<asp:Label ID="Label4" runat="server" Font-Names="Tahoma" Font-Size="8pt" ForeColor="Green"
Style="position: static" Text="آخرین فعالیت:"></asp:Label>
<asp:Label ID="lblLastActivity" runat="server" Font-Names="Tahoma" Font-Size="8pt"
ForeColor="Navy" Style="position: static" Text='<%# eval("LastActivityDate") %>'></asp:Label></td>
<td style="width: 50%; background-color: aliceblue" unselectable="on"></td>
</tr>
</table>
</div>
</ItemTemplate>
<HeaderTemplate>
<div style="text-align: center">
<table style="width: 100%; position: static; background-color: whitesmoke">
<tr>
<td style="width: 100%">
<span style="font-size: 8pt; font-family: Tahoma"><strong>لیست کاربران سایت:</strong></span></td>
</tr>
</table>
</div>
</HeaderTemplate>
</asp:TemplateField>
</Columns>
<PagerSettings FirstPageText="ابتدا" LastPageText="انتها" Mode="NumericFirstLast"
NextPageText="بعدی" Position="TopAndBottom" PreviousPageText="قبلی" />
<PagerStyle BackColor="Transparent" Font-Names="Tahoma" Font-Size="8pt" ForeColor="DarkGray" />
</asp:GridView>

کد رویداد کلیک دکمه خذف:

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim gr As GridViewRow
For Each gr In grdUsers.Rows
Dim lblSelected As Label = CType(gr.FindControl("lblUserName"), Label)
Dim chkSelected As CheckBox = CType(gr.FindControl("chkRemove"), CheckBox)
If Not chkSelected Is Nothing Then
If chkSelected.Checked Then
Membership.DeleteUser(lblSelected.Text)
End If
End If
Next
End Sub
مشکل اینجاست که با اجرای دستورات فوق تغییری در حالت Checked چک باکس به وجود نمیاد با اینکه توسط کاربر چک شده و در اصل True هست ولی وقتی با Breakpoint چک می کنم می بینم که False در نظر میگیره.یعنی chkSelected.Checked=False از دید برنامه.
توی سرچ هایی که کردم یکی از دوستان می گفت CheckBox در حالت Edit کار می کنه فقط.
دوستان اگه لطف کنند کمک کنند ممنون میشم.خیلی وقتم رو گرفته

mp2009
یک شنبه 15 مهر 1386, 20:07 عصر
دوست عزیز از کدی که قرار دادم استفاده کن و قسمت sql اون رو با برنامه خودت set کن
موفق باشی

Ehsan Valinouri
یک شنبه 15 مهر 1386, 20:47 عصر
دوست عزیر میشه ممنون از جوابتون ولی میشه بفرمائید کد شما با کد بنده چه تفاوتی داره؟ من که تفاوتی ندیدم.فقط شما به C# نوشتی و من با VB. البته شما دستی از دیتابیس پاک می کنی و من با Membership.DeleteUser.فکر نمی کنم تفاوت دیگه ای داشته باشه. اگه من اشتباه می کنم منو از اشتباه در بیارید .

mp2009
یک شنبه 15 مهر 1386, 22:38 عصر
بله کاملا حق با شماست

Ehsan Valinouri
یک شنبه 15 مهر 1386, 22:59 عصر
پس به نظر شما اشکال کار از کجاست؟ چرا کد شما کار میکنه و کد من نه؟
اشکال اصلی اونجاست که Checkbox خاصیت Checked اش در هر حالتی False میمونه.اگه این حل شه دیگه مشکلی نیست.اشکال از کجا میتونه باشه؟ شایدم کد شما با کد من یه فرق های کوچولویی داره که همون ها تاثیرگذارند.

Ehsan Valinouri
دوشنبه 16 مهر 1386, 21:09 عصر
دوستان میشه مشکل منو یه بررسی بکنید ببینید اشکال از کجاست؟ به خدا عقل من که دیگه فرمان نمیده.هرچی فکر می کنم میبینم کد اشکالی نداره.البته این نظر منه خوشحال میشم نظر و کمک اساتید ASP.Net رو هم داشته باشم.

mp2009
دوشنبه 16 مهر 1386, 23:54 عصر
ببینید متد DeleteUser فقط یه user رو میگیره و همونو حذف میکنه . نمیشه برای چند user استفاده کرد
موفق باشی

Ehsan Valinouri
سه شنبه 17 مهر 1386, 14:28 عصر
دوست عزیز فرمایش شما درسته ولی این اشکال در کد من وجود نداره. چون با هر بار چک کردن CheckBox اگه Checked=True باشه اون موقع دستور DeleteUser اجرا میشه.یعنی در هر بار اجرا ماکزیمم 1 User حذف خواهد شد.

Ehsan Valinouri
جمعه 20 مهر 1386, 01:43 صبح
خوب مشکل تا حد زیادی حل شد. در واقع نمی تونم علت منطقی برای این راه حل بیارم.چون خود منم اتفاقی و با آزمون و خطا متوجه اون شدم.
اشکال کار این بود که من دیتا سورس گرید رو به این صورت داده بودم:

membership.GetAllUsers()
که از نظر تکنیکی مشکلی نداره و کاملا درست عمل می کنه اما تو همین گیر و دار ور رفتن با گرید متوجه شدم که اگه دیتا سورس رو به صورت SQL Data Source بهش بدیم دیگه این ایراد تخیلی را نمیده.منم مجبور شدم که به جای کد بالا یه Custom SQL Statement بهش بدم و در این حالت بود که خاصیت Checked چک باکس توسط برنامه تشخیص داده میشه و مشکل تا حد خیلی زیادی مرتفع میشه. اما اشکال جدید اینه رو یه رکورد خاص با اینکه دستورات خذف کامل اجرا میشه ولی رکورد عملا تو DB میمونه و حذف نمیشه. واقعا نمی دونم با این ایرادهای حل نشدنی چیکار کنم.
همون طور که گفتم روش بالا منطقی و تکنیکی نیست.خوشحال میشم دوستان اگه تجربه و ایده بهتری دارند اینجا بزارند. راستی این مشکل آخری رو چیکار کنم؟

h.alizadeh
پنج شنبه 10 آبان 1386, 22:57 عصر
سلام،

میشه این برنامه حذف در پست2 رو به زبون وبی بدید من خیلی لازم دارم....

من خودم نتونستم خوب به زبون وبی تبدیل کنم ...

mp2009
شنبه 12 آبان 1386, 01:28 صبح
اینم کد vb برای داداش گلم



Private Sub Dgrid()
'Por Kardane DataGrid
Try
Dim da As New SqlDataAdapter("Select NewsId,NewsTitle From TblNews order by NewsID desc", cn)
Dim ds As New DataSet()
da.Fill(ds, "Tbl")
DataGrid1.DataSource = ds.Tables("Tbl").DefaultView
DataGrid1.DataKeyField = "NewsID"
DataGrid1.DataBind()
Catch
End Try

End Sub
' hazfe record
Protected Sub BtnDel_Click(ByVal sender As Object, ByVal e As EventArgs)
Dim strB As New StringBuilder()
For Each i As DataGridItem In DataGrid1.Items
Dim cb As CheckBox = DirectCast(i.Cells(2).Controls(1), CheckBox)
If cb.Checked Then
' strB.Append(" ");
strB.Append(DataGrid1.DataKeys(i.ItemIndex).ToStri ng())
End If
Next
cmd.CommandText = "DELETE from TblNews Where (CHARINDEX (LTRIM (STR (newsId ) ), @NewsId)>0)"
cmd.Parameters.Add("@NewsId", SqlDbType.Int)
cmd.Parameters("@NewsId").Value = strB.ToString()
cn.Open()
cmd.ExecuteNonQuery()
cn.Close()
Dgrid()
End Sub

موفق باشی

h.alizadeh
شنبه 12 آبان 1386, 10:59 صبح
خیییییلی ممنونم لطف کردی...
فقط ببین namespace , این StringBuilder چیه؟؟؟

می خوام imports کنم

mp2009
یک شنبه 13 آبان 1386, 00:20 صبح
موس رو روش نگه دار خودش میاد