PDA

View Full Version : طریقه دسترسی به کنترلهای درون datagrid template



tc1000
یک شنبه 02 اردیبهشت 1386, 17:08 عصر
باسلام
من یک tempelate میزام توی datagrid و بعد میام اون رو Edit میکنم و یک کنترل مثل label یا هر چیز دیگرو میزام اونجا ولی توی کد نویسی از طریق id کنترل قابل دسترسی نیستند.
چطوری میشه به این کنترل ها که درونtemplate قر ار میگیرند دسترسی داشت.
لطفا یک نمونه کد هم برای مثال در صورت امکان، ممنون میشم.

MehranZand
یک شنبه 02 اردیبهشت 1386, 17:16 عصر
شما باید با متد findcontrol اول کنترل مورد نظر را در خطی که اقدام به update میکنید
پیدا کنید . به نمونه کد زیر توجه کنید :


Protected Sub GridView1_RowUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs) Handles GridView1.RowUpdating
Dim editRow As GridViewRow = GridView1.Rows(e.RowIndex)
Dim txtUpdate As TextBox = editRow.FindControl("textbox3")
Dim con As New SqlConnection(ConfigurationManager.ConnectionStrin gs("con").ConnectionString)
Dim cmd As New SqlCommand("Update _userinfo SET firstname=@firstname where username=@username ", con)
con.Open()
cmd.Parameters.AddWithValue("@firstname", txtUpdate.Text)
cmd.Parameters.AddWithValue("@username", GridView1.DataKeys(e.RowIndex).Value.ToString)
cmd.ExecuteNonQuery()
con.Close()
GridView1.EditIndex = -1
Call CallBind()
End Sub


اگر موردی بود باز در خدمتم

tc1000
یک شنبه 02 اردیبهشت 1386, 17:32 عصر
با سلام
این کد:

Dim txtUpdate As TextBox = editRow.FindControl("textbox3")

و این کد:

cmd.Parameters.AddWithValue("@username", GridView1.DataKeys(e.RowIndex).Value.ToString)
برای پیدا کردن اون کنترل در tempelate هستش درست فهمیدم؟

MehranZand
یک شنبه 02 اردیبهشت 1386, 17:53 عصر
خط اولی که شما نوشتید برای پیدا کردن کنترل و قرار دادن آن درون یک شی textbox ساخته شده است.

اما خط دوم که شما نوشته اید برای پاس کردن فیلد کلید خط جاری است که برای UPDATE
لازم بوده است.

tc1000
دوشنبه 03 اردیبهشت 1386, 01:42 صبح
با تشکر از شما

یه مسئله ای اینجا وجود داره من به این شکل کل خودم رو نوشتم که برای اضافه کردن در datagrid به کارمیره



Dim dr2 As SqlDataReader
dr2 = mycommand.ExecuteReader()

Do While dr2.Read()

dr = dt.NewRow()
dr(0) = dr2("date")
dr(1) = dr2("user")
dr(2) = dr2("mob")
dr(3) = dr2("address")
dr(4) = dr2("message")
dr(5) = dr2("type")

dt.Rows.Add(dr)
Loop
conn.Close()
'return a DataView to the DataTable
'CreateDataSource = New DataView(dt)

Dim dv As DataView = New DataView(dt)
dv.Sort = SortField
CreateDataSource = dv

حالا میخوام یک template اضافه کنم و مثلا فیلد typeو فیلد message رو در این tempalete بزارم
میشه بگید طوری این کار رو کنم

MehranZand
دوشنبه 03 اردیبهشت 1386, 09:35 صبح
اضافه کردن قسمت Template به قسمت codebehind ربطی نداره.
شما اگر بخواهید فیلدی را بصورت Template در بیارید در خاصیت Columns
datagrid باید یک فیلد از نوع ItemTemplate اضافه کنید یا فیلدی که موجود دارید
را در همان قسمت Convert To Template کنید.

tc1000
دوشنبه 03 اردیبهشت 1386, 09:42 صبح
بله میدونم چطور اطلاعات رو به اون Columns که template هست برسونم.
مشکل من اینه.
در مثال بالا من گفته بودم که اینطوری اطلاعات رو در یک datagrid میریزم حالا اگر اخرین گزینه بشه Template چطوری اطلاعات رو به اون اضافه کنم

zshahrzad
سه شنبه 04 اردیبهشت 1386, 10:46 صبح
سلام
ببخشید من هم سئوالی مشابه داشتم به همین دلیل آن را در این تاپیک مطرح کردم .
مشکل من اینه که کنترل هایی مثل Dropdown list که د رDatagrid استفاده می شوند در موقع کد نویسی شناخته نمی شوند و نمی توان بوسیله ID به آنها دسترسی داشت و برای آنها برنامه نوشت مثلاً اگه من بخواهم با تغییر مقدار این dropdown list تابعی اجرا شده و مقدار انتخاب شده این drop down list در مقدار یکی دیگر از ستونهای دیتاگرید ضرب شده و در ستون سومی نمایش داده شود نمی توانم به مقدار Dropdown از طریق ID دسترسی داشته باشم. و به همین دلیل از طریق کدنویسی نتونستم اتصالش را با Database برقرار کنم . از طریق wizard هم عمل می کنم به این ترتیب که یک sqlconnection ، یک sqlcommand و یک Dataset قرار می دهم ، بعد برای Dataset یک Data table تعیین میکنم و Datasourse مربوط به Dropdownlist را برابر با Dataset قرار می دهم DataTextFieldو DataValueField آنراهم مقدار می دهم اما با DropDown list خالیه ، البته این را هم بگم که منبع Dropdown list و datagrid با هم فرق می کنن و datagrid را از طریق کد نویسی مقید کردم و مشکلی هم نداره . آیا شما می دونید مشکل کجاست و راه حل چیه ؟
خیلی ممنون مشو م اگه راهنمای کنید.

babi_wd
چهارشنبه 05 اردیبهشت 1386, 00:38 صبح
باسلام
من یک tempelate میزام توی datagrid و بعد میام اون رو Edit میکنم و یک کنترل مثل label یا هر چیز دیگرو میزام اونجا ولی توی کد نویسی از طریق id کنترل قابل دسترسی نیستند.
چطوری میشه به این کنترل ها که درونtemplate قر ار میگیرند دسترسی داشت.
لطفا یک نمونه کد هم برای مثال در صورت امکان، ممنون میشم.



<%@ Page language="C#" %>

<script runat="server">

void CustomersGridView_RowEditing(Object sender, GridViewEditEventArgs e)
{

// Get the country for the row being edited. For this example, the
// country is contained in the seventh column (index 6).
String country = CustomersGridView.Rows[e.NewEditIndex].Cells[6].Text;

// For this example, cancel the edit operation if the user attempts
// to edit the record of a customer from the Unites States.
if (country == "USA")
{
// Cancel the edit operation.
e.Cancel = true;
Message.Text = "You cannot edit this record.";
}
else
{
Message.Text = "";
}

}

</script>


این صفحه MSDN رو مطالعه بفرمایید
ms-help://MS.MSDN.vAug06.en/cpref16/html/T_System_Web_UI_WebControls_GridView_Members.htm

babi_wd
چهارشنبه 05 اردیبهشت 1386, 00:41 صبح
سلام
ببخشید من هم سئوالی مشابه داشتم به همین دلیل آن را در این تاپیک مطرح کردم .
مشکل من اینه که کنترل هایی مثل Dropdown list که د رDatagrid استفاده می شوند در موقع کد نویسی شناخته نمی شوند و نمی توان بوسیله ID به آنها دسترسی داشت و برای آنها برنامه نوشت مثلاً اگه من بخواهم با تغییر مقدار این dropdown list تابعی اجرا شده و مقدار انتخاب شده این drop down list در مقدار یکی دیگر از ستونهای دیتاگرید ضرب شده و در ستون سومی نمایش داده شود نمی توانم به مقدار Dropdown از طریق ID دسترسی داشته باشم. و به همین دلیل از طریق کدنویسی نتونستم اتصالش را با Database برقرار کنم . از طریق wizard هم عمل می کنم به این ترتیب که یک sqlconnection ، یک sqlcommand و یک Dataset قرار می دهم ، بعد برای Dataset یک Data table تعیین میکنم و Datasourse مربوط به Dropdownlist را برابر با Dataset قرار می دهم DataTextFieldو DataValueField آنراهم مقدار می دهم اما با DropDown list خالیه ، البته این را هم بگم که منبع Dropdown list و datagrid با هم فرق می کنن و datagrid را از طریق کد نویسی مقید کردم و مشکلی هم نداره . آیا شما می دونید مشکل کجاست و راه حل چیه ؟
خیلی ممنون مشو م اگه راهنمای کنید.

البته در دانت 2 (مثال برای فرم ویو)



((DropDownList)FormView1.FindControl("product")).DataTextField = "Product_name";

zshahrzad
چهارشنبه 05 اردیبهشت 1386, 01:32 صبح
سلام خیلی ممنون از پاسختون .اما راستش من برای دات نت 1 و ترجیحاً VB میخواهم ، اما امیدوارم که از این کد بتونم راهنمایی بگیرم.

babi_wd
چهارشنبه 05 اردیبهشت 1386, 01:35 صبح
من Vb بلد نیستم
زیاد فرقی نمیکنه،اگه یه ذره استعداد به خرج بدی،حله

zshahrzad
چهارشنبه 05 اردیبهشت 1386, 01:44 صبح
خیلی ممنون
آیا در موردنحوه نوشتن تابعی که با تغییر مقدار این Dropdown list اتفاق می افته هم اطلاع دارید ؟(کجا باید آن را بنویسیم)

tc1000
چهارشنبه 05 اردیبهشت 1386, 02:27 صبح
<%@ Page language="C#" %>

<script runat="server">

void CustomersGridView_RowEditing(Object sender, GridViewEditEventArgs e)
{

// Get the country for the row being edited. For this example, the
// country is contained in the seventh column (index 6).
String country = CustomersGridView.Rows[e.NewEditIndex].Cells[6].Text;

// For this example, cancel the edit operation if the user attempts
// to edit the record of a customer from the Unites States.
if (country == "USA")
{
// Cancel the edit operation.
e.Cancel = true;
Message.Text = "You cannot edit this record.";
}
else
{
Message.Text = "";
}

}

</script>


این صفحه MSDN رو مطالعه بفرمایید
ms-help://MS.MSDN.vAug06.en/cpref16/html/T_System_Web_UI_WebControls_GridView_Members.htm

با سلام
میشه توضیح بدید این کد رو

babi_wd
چهارشنبه 05 اردیبهشت 1386, 02:40 صبح
خیلی ممنون
آیا در موردنحوه نوشتن تابعی که با تغییر مقدار این Dropdown list اتفاق می افته هم اطلاع دارید ؟(کجا باید آن را بنویسیم)

کد HTML:


<asp:DropDownList ID="DropDownList1" runat="server" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged">
</asp:DropDownList>


کد سرور:



protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{

}


با هر تغییر در DropDownList این تابع اجرا میشود

babi_wd
چهارشنبه 05 اردیبهشت 1386, 02:45 صبح
مثال بسیار ساده ایه



String country = CustomersGridView.Rows[e.NewEditIndex].Cells[6].Text

با این خط داره محتویات یه لیبل رو در سلول شماره 6 که نوعش تمپلیته رو داخل یه رشته میریزه
بعد چک میکنه که اون رشته اگه برابرUSA بود ویرایش رو کنسل میکنه

tc1000
چهارشنبه 05 اردیبهشت 1386, 10:58 صبح
با عرض شرمندگی
میتونید یک نمونه برنامه بزارید برام
ممنون میشم

zshahrzad
چهارشنبه 05 اردیبهشت 1386, 11:11 صبح
سلام
ضمن تشکر از راهنمایی تون ، راستش همونطور که گفتم Dropdown List که من استفاده می کنم داخل datagrid هست وبه این شکل که شما فرمودید مثل اینکه نمی شه مستقیماً برای اون تایع نوشت.




کد HTML:

کد:
<asp:DropDownList ID="DropDownList1" runat="server" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged"> </asp:DropDownList>
کد سرور:


کد:
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) { }

راستش در مورد نحوه دسترسی به مقدار این Dropdown List نیز با توجه به کدی که فرمودید




البته در دانت 2 (مثال برای فرم ویو)

کد:
((DropDownList)FormView1.FindControl("product")).DataTextField = "Product_name";


و کدهایی مانند :



Dim num As TextBox
(num = (Datagrid1.Controls.Item(4)).FindControl("DropdwonList1").Controls(0




که خودم امتحان کردم به نتیجه نرسیدم.(البته شاید به خاطر تازه کار بودن جایی اشتباه می کنم ) خواهشمندم اگه راه حلی دارید ارائه بدین.

tc1000
چهارشنبه 05 اردیبهشت 1386, 20:16 عصر
لطفا یک پروژه بنویسید و بزارید چون دیگه این قضیه پاک عصبیم کرده
اصلا template رو نمی فهمم. و اصلا هیچ کاری نمی تونم روش انجام بدم.
به من کمک کنید تا این قضیه رو حل کنم.

tc1000
پنج شنبه 06 اردیبهشت 1386, 04:01 صبح
با سلام
بالاخره این مطلبی که میخواستم رو پیدا کردم و کار هم میکنه



Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim DS As DataSet
Dim MyConnection As SqlConnection
Dim MyCommand As SqlDataAdapter

MyConnection = New SqlConnection("DATA SOURCE=127.0.0.1;UID=test;PWD=12345;DATABASE=bank")
MyCommand = New SqlDataAdapter("select * from tbl_user", MyConnection)

DS = New DataSet()
MyCommand.Fill(DS, "username")


MyDataGrid.DataSource = DS.Tables("username").DefaultView

MyDataGrid.DataBind()
End Sub
کد HTML


<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">



<html>



<body topmargin="0" leftmargin="0" marginwidth="0" marginheight="0" style="font-size: 35px; font-family: Tahoma;">
&nbsp;<asp:DataGrid ID="MyDataGrid" runat="server" AllowPaging="True" AutoGenerateColumns="False"
CellPadding="4" Font-Name="Verdana" Font-Names="Verdana" Font-Size="8pt" ForeColor="#333333"
GridLines="Vertical" HeaderStyle-BackColor="#aaaadd" HorizontalAlign="Center"
OnPageIndexChanged="MyDataGrid_Page" OnSortCommand="MyDataGrid_Sort" PageSize="5"
SelectedIndex="0">
<FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
<EditItemStyle BackColor="#2461BF" />
<SelectedItemStyle BackColor="#D1DDF1" Font-Bold="False" Font-Italic="False" Font-Overline="False"
Font-Strikeout="False" Font-Underline="False" ForeColor="#333333" />
<PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Right" Mode="NumericPages"
Position="TopAndBottom" VerticalAlign="Middle" Visible="False" Wrap="True" />
<AlternatingItemStyle BackColor="White" Wrap="True" />
<ItemStyle BackColor="#EFF3FB" HorizontalAlign="Center" VerticalAlign="Middle" />
<HeaderStyle BackColor="#8080FF" Font-Bold="True" ForeColor="White" HorizontalAlign="Center" />
<Columns>
<asp:TemplateColumn>
<HeaderTemplate>
<span style="font-size: 10pt; font-family: Tahoma">نام کاربری و رمز عبور<br />
<table>
<tr>
<td style="width: 170px; border-right: silver 1px solid; border-top: silver 1px solid; border-left: silver 1px solid; border-bottom: silver 1px solid; text-align: center;">
رمز عبور</td>
<td style="width: 170px; border-right: silver 1px solid; border-top: silver 1px solid; border-left: silver 1px solid; border-bottom: silver 1px solid; text-align: center;">
نام کاربری</td>
</tr>
</table>
</span>
</HeaderTemplate>
<ItemTemplate><table>
<tr>
<td style="width: 170px; text-align: center; border-top-width: thin; border-right: green thin solid; border-left-width: thin; border-bottom-width: thin;">
<%#DataBinder.Eval(Container.DataItem, "username")%>
</td>
<td style="width: 170px; text-align: center; border-top-width: thin; border-left-width: thin; border-bottom-width: thin; border-right-width: thin; border-right-color: black;">
<span style="font-family: Tahoma; border-left-color: black; border-left-style: dashed;"></span>
<%#DataBinder.Eval(Container.DataItem, "password")%>
</td>
</tr>
</table>

</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn>
<HeaderTemplate>
<span style="font-size: 10pt; font-family: Tahoma">اعتبار</span>
</HeaderTemplate>
<ItemTemplate><table>
<tr>
<td style="width: 170px; text-align: center; border-top-width: thin; border-left-width: thin; border-bottom-width: thin; border-right-width: thin; border-right-color: green;">
<%#DataBinder.Eval(Container.DataItem, "Credit")%>
</td>

</tr>
</table>

</ItemTemplate>
<FooterTemplate>
<span style="font-size: 10pt; font-family: Tahoma">جمع</span>
</FooterTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid><br />
&nbsp;<br />
<br />


</body>
</html>
فقط یک مسئله ای برای من مبهم هستش، اون هم اینه که :


<%#DataBinder.Eval(Container.DataItem, "Credit")%>
نمیشه توی کد برنامه نوشت حتما باید توی html نوشته بشه
ایا روش بهتری برای به دست اوردن این موضوع هست یا خیر؟

tc1000
جمعه 07 اردیبهشت 1386, 04:25 صبح
چطوری بالاخره این کار رو انجام بدیم !!!!!!!!