PDA

View Full Version : فراخوانی یه فرم در کنترل webbrowser



yekta64
دوشنبه 17 خرداد 1389, 12:27 عصر
سلام دوستان
من در برنامه از یه کنترل وب بروزر استفاده کردم و یه متن رو از دیتابیس می خونم و در این کنترل قرار می دم حالا می خوام با کلیک رو قسمتی از متن یه فرم جدید برام باز بشه و یه id هم به فرم جدید منتقل بشه چطور این کار رو انجام بدم؟؟؟
در واقع مشکل من با چگونگی کلیک روی این کنترل هستش؟؟/
مرسی

yekta64
سه شنبه 18 خرداد 1389, 14:12 عصر
دوستان به طور کلی راهی هست که بشه در کنترل webbrowser یک فرم رو صدا زد؟

مرسی

yekta64
پنج شنبه 20 خرداد 1389, 08:05 صبح
دوستان کسی راه حلی برای این مسئله نداره؟؟؟؟؟؟

Hossis
پنج شنبه 20 خرداد 1389, 22:07 عصر
سلام دوست عزيز
هر کدام از تگ هاي اچ تي ام ال مي توانند به عنوان يک شيء تلقي شده و رويدادهاي مختلف به خود بگيرند فقط کافي است يک شيء جديد از نوع HtmlElements همراه رويداد تعريف کرده و به تگ مربوطه (که کنترلهاي وب يک نوع از اين تگ ها هستند) نسبت دهيد.
مراحل کار
اول : يک شيي به نام Doc ايجاد مي کنيم که همان WB.Document است
با هر بار کامل شدن لود WB اين شيء معرفي مي شود
دوم: يک شيء‌ ديگر به نام Div اضافه کرده و با کليک بر روي Doc آن را به تگ کليک شده منتسب مي کنيم
حالا هروقت روي Div کليک شد، رويداد مورد نظر فراخواني مي شه
مثال
'' WB == Your WebBrowser


Dim WithEvents Div As HtmlElement
Dim WithEvents Doc As HtmlDocument

Private Sub Wb_DocumentCompleted(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEv entArgs) Handles WB.DocumentCompleted
Doc = WB.Document

end sub
Private Sub Doc_Click(ByVal sender As Object, ByVal e As System.Windows.Forms.HtmlElementEventArgs) Handles Doc.Click
Div = Doc.GetElementFromPoint(e.ClientMousePosition)

end sub
Private Sub Div_Click(ByVal sender As Object, ByVal e As System.Windows.Forms.HtmlElementEventArgs) Handles Div.Click
MsgBox("YourTag Clicked")
End Sub


باز اگر مشکلي بود در خدمتم

yekta64
جمعه 21 خرداد 1389, 15:59 عصر
سلام دوست عزيز
هر کدام از تگ هاي اچ تي ام ال مي توانند به عنوان يک شيء تلقي شده و رويدادهاي مختلف به خود بگيرند فقط کافي است يک شيء جديد از نوع HtmlElements همراه رويداد تعريف کرده و به تگ مربوطه (که کنترلهاي وب يک نوع از اين تگ ها هستند) نسبت دهيد.
مراحل کار
اول : يک شيي به نام Doc ايجاد مي کنيم که همان WB.Document است
با هر بار کامل شدن لود WB اين شيء معرفي مي شود
دوم: يک شيء‌ ديگر به نام Div اضافه کرده و با کليک بر روي Doc آن را به تگ کليک شده منتسب مي کنيم
حالا هروقت روي Div کليک شد، رويداد مورد نظر فراخواني مي شه
مثال
'' WB == Your WebBrowser


DimWithEvents Div As HtmlElement
DimWithEvents Doc As HtmlDocument

PrivateSub Wb_DocumentCompleted(ByVal sender AsObject, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEv entArgs) Handles WB.DocumentCompleted
Doc = WB.Document

end sub
PrivateSub Doc_Click(ByVal sender AsObject, ByVal e As System.Windows.Forms.HtmlElementEventArgs) Handles Doc.Click
Div = Doc.GetElementFromPoint(e.ClientMousePosition)

end sub
PrivateSub Div_Click(ByVal sender AsObject, ByVal e As System.Windows.Forms.HtmlElementEventArgs) Handles Div.Click
MsgBox("YourTag Clicked")
EndSub


باز اگر مشکلي بود در خدمتم

یه دنیا ممنون دوست عزیز
خیلی به من کمک کردید واقعا ممنون
یه سوال دیگه
اگه من داده های که در کنترل wb قرار می دم رو از دیتابیس بخونم به طوری که هر رکورد رو در یه خط از این کنترل قرار بدم حالا با کلیک روی هر خط داده در این کنترل بخوام ایدی اون رکورد از جدول رو بدست بیارم باید چکار کنم؟؟؟
مرسی

Hossis
جمعه 21 خرداد 1389, 17:23 عصر
من دقيقا يک پروژه به همين منوال دارم
براي اين کار به اين شيوه عمل مي کنيم
هر خطي که از ديتابيس وارد WB مي کنيد،‌فيلد ID رو در Id اون تگ قرار بديد
بعد به همون منوالي که گفتم، مي تونيد با کليک بر روي تگ مورد نظر ،‌ آي دي اون رو گرفته و توسط اين آي دي به رکورد مورد نظر در ديتابيس دسترسي پيدا کنيد.
به اين صورت
for each Row In datagridView
dim P as string
p="<p Id=" & row.cells("Id").value & ">"
P+=row.vells("Matn").value & "</p>"
next
WB.documentText="<Body style=""> & P & "</Body
">
بعد با کليک بر روي Div مي نويسيم
Dim Id As String =div.Id

Hossis
جمعه 21 خرداد 1389, 17:31 عصر
اين هم يک پروژه نمونه که دقيقا همين کار را انجام داده
بانک اطلاعاتش به خاطر حجم زياد حذف شد ولي در تصوير زير ، مي تونيد فيلدها و جدول هاش رو ببينيد
http://www.barnamenevis.org/forum/attachment.php?attachmentid=50988&stc=1&d=1276262534

yekta64
شنبه 22 خرداد 1389, 13:36 عصر
اين هم يک پروژه نمونه که دقيقا همين کار را انجام داده
بانک اطلاعاتش به خاطر حجم زياد حذف شد ولي در تصوير زير ، مي تونيد فيلدها و جدول هاش رو ببينيد
http://www.barnamenevis.org/forum/attachment.php?attachmentid=50988&stc=1&d=1276262534


بازم یه دنیا ممنون دوست عزیز
میشه لطف کنید در مورد کد مربوط به قسمت خواندن داده ها از دیتابیس و قرار دادن انها توی کنترل wb توضیح بدید؟؟؟
مرسی

Hossis
شنبه 22 خرداد 1389, 23:55 عصر
در اين دستور، تک تک رديف ها يا تعداد خاصي از آنها به ديتاگريد ريخته مي شود. فيلد ID حتما بايد جزو اين فيلدها باشد.
سپس با استفاده از حلقه For تک تک رديفهاي ديتاگريد مورد بررسي قرار گرفته و ستون Id به خاصيت Id مربوط به تگ اختصاص مي يابد ( هر کدام از تگهاي اچ تي ام ال مي توانند يک Id داشته باشند)
سپس فيلد مورد نظر شما (فيلد متني ) به عنوان متن نمايش داده شده براي آن تگ در نظر گرفته مي شود.
از آنجا که شما مي خواهيد هر رديفي در يک سطر از WB قرار گيرد، بايد از تگ P استفاده کنيد
Dim tg as string ="<p Id=" & row.cells("Id").value & ">"
tg=tg & row.cells("Matn").value & "</p>"
اگر مشکل ديگري بود در خدمتيم

yekta64
یک شنبه 23 خرداد 1389, 08:04 صبح
در اين دستور، تک تک رديف ها يا تعداد خاصي از آنها به ديتاگريد ريخته مي شود. فيلد ID حتما بايد جزو اين فيلدها باشد.
سپس با استفاده از حلقه For تک تک رديفهاي ديتاگريد مورد بررسي قرار گرفته و ستون Id به خاصيت Id مربوط به تگ اختصاص مي يابد ( هر کدام از تگهاي اچ تي ام ال مي توانند يک Id داشته باشند)
سپس فيلد مورد نظر شما (فيلد متني ) به عنوان متن نمايش داده شده براي آن تگ در نظر گرفته مي شود.
از آنجا که شما مي خواهيد هر رديفي در يک سطر از WB قرار گيرد، بايد از تگ P استفاده کنيد
Dim tg as string ="<p Id=" & row.cells("Id").value & ">"
tg=tg & row.cells("Matn").value & "</p>"
اگر مشکل ديگري بود در خدمتيم


سلام مرسی
یه سوال دیگه من اطلاعات رو از دیتابیس می خونم و در یه گرید ویو قرار می دم منتها وقتی تعداد ردیف های گرید رو می خونم صفر هستش دقیقا مثل شما عمل کردم چرا جواب نمی ده؟؟؟؟؟

کدی که من نوشتم به این صورت هستش:


Dim cmd As New OleDbCommand
Dim da As New OleDbDataAdapter
Dim ds As New DataSet
Dim str1 As String
Con.Open()
str1 = "select * from Table2"
da = New OleDbDataAdapter(str1, Con)
da.Fill(ds, "tbl")
Dim DG As New DataGridView
DG.DataSource = ds
Dim tg As String
For Each Row As DataGridViewRow In DG.Rows
tg = "<p Id=" & Row.Cells("Id").Value & ">"
tg = tg & Row.Cells("Text1").Value & "</p>"
Next
WebBrowser1.DocumentText = "<Body style="">" & tg & "</Body>"


چیزی که در کنترل wb به من نشون می ده به این صورت هستش:
<Body style=">

کجا اشتباه کردم؟؟؟
مرسی

Hossis
یک شنبه 23 خرداد 1389, 12:02 عصر
da.Fill(ds, "tbl")
..
DG.DataSource = ds

درستش اينه

da.Fill(ds, "Table2")
'..
DG.DataSource = ds.tables("Table2")

Hossis
یک شنبه 23 خرداد 1389, 12:06 عصر
WebBrowser1.DocumentText = "<Body style="">" & tg & "</Body>"

style براي اين هست که شما شکل و شمايل خاصي براي زيبايي به متنتون بديد لذا اگر مي خواهيد خالي باشد ، بهتره ذکر ش نکنيد

WebBrowser1.DocumentText = "<Body dir=rtl>" & tg & "</Body>"
dir=rtl == باعث ميشه که صفحه وب از راست به چپ نشون داده بشه

yekta64
یک شنبه 23 خرداد 1389, 12:16 عصر
da.Fill(ds, "tbl")
..
DG.DataSource = ds

درستش اينه

da.Fill(ds, "Table2")
'..
DG.DataSource = ds.tables("Table2")




مرسی دوست عزیز مشکل اینجاست که با استفاده از این کد چیزی در دیتاگرید ویو نشون نمی ده یعنی تعداد ردیف های گرید ویو رو 0 بر می گردونه واقعا نمی دونم مشکل چی هستش؟؟؟؟



Dim cmd As New OleDbCommand
Dim da As New OleDbDataAdapter
Dim ds As New DataSet
Dim str1 As String
Con.Open()
str1 = "select * from Table2"
da = New OleDbDataAdapter(str1, Con)
da.Fill(ds, "Table2")
Dim DG As New DataGridView
DG.DataSource = ds.Tables("Table2")

yekta64
یک شنبه 23 خرداد 1389, 12:39 عصر
دوست عزیز این مشکل حل شد ولی حالا چیزی رو در کنترل wb نشون نمی ده؟؟؟؟؟
البته با این فرض که من یه دیتاگریر ویو روی صفحه دارم و در زمان اجرا ایجاد نمی کنم فقط اون رو پر می کنم

حالا چرا چیزی در wb قرار نمی گیره؟؟؟


Dim cmd As New OleDbCommand
Dim da As New OleDbDataAdapter
Dim ds As New DataSet
Dim str1 As String
Con.Open()
str1 = "select * from Table2"
da = New OleDbDataAdapter(str1, Con)
da.Fill(ds, "Table2")
DataGridView1.DataSource = ds.Tables("Table2")
Dim tg As String
For i = 0 To DataGridView1.Rows.Count - 1
tg = "<p Id=" & DataGridView1.Rows(i).Cells(0).Value & ">"
tg = tg & DataGridView1.Rows(i).Cells(1).Value & "</p>"
Next
WebBrowser1.DocumentText = "<Body dir=rtl>" & tg & "</Body>"


فکر می کنم ایراد از & باشه که کنار تگ قرار دادیم شما خودتون این کار رو امجام دادید نتیجه گرفتیید؟؟
ممنون میشم بگید مشکل چی هستش؟؟؟؟

Hossis
یک شنبه 23 خرداد 1389, 21:26 عصر
به جاي اين خط آخري ،‌اين خط رو بنويسيد ،‌جواب مي ده
WebBrowser1.Document.write = "<Body dir=rtl>" & tg & "</Body>"
WebBrowser1.Document..domdocument.close
قبلا از طريق ديباگ يک وقفه روي خط فوق ايچاد کرده و چک کنيد ببينيد متغير tg پر شده يا نه ؟؟

Hossis
یک شنبه 23 خرداد 1389, 21:29 عصر
همون پروژه اي که آپلود کرده بودم ، براش يک بانک درست کنيد و اين برنامه رو تست کنيد، ليست جداول و فيلدها هم توي تصوير ضميمه هست

yekta64
دوشنبه 24 خرداد 1389, 08:34 صبح
همون پروژه اي که آپلود کرده بودم ، براش يک بانک درست کنيد و اين برنامه رو تست کنيد، ليست جداول و فيلدها هم توي تصوير ضميمه هست

سلام
مرسی دوست عزیز درست شد من الان یه مشکل دارم اونم اینه که در رمورد های که از جدول می خونم برای بعضی هاش یه تک b قرار دادم که قسمتی از متن رو bold کنه مشکل اینجاست که وقتی روی اون قسمن از متن که bold شده کلیک می کنم ایدی رو به من نشون نمی ده ولی روی قسمتی که bold نیست کلیک می کنم ایدی رو نشون می ده به نظر شما مشکل چی هستش؟؟؟
یه سوال دیگه اگه بخوام روی اون قسمت از متن که bold شده ماوس علامت دست بشه باید چکار کنم؟؟؟؟
مرسی

Hossis
دوشنبه 24 خرداد 1389, 10:11 صبح
وقتی روی اون قسمن از متن که bold شده کلیک می کنم ایدی رو به من نشون نمی ده ولی روی قسمتی که bold نیست کلیک می کنم ایدی رو نشون می ده به نظر شما مشکل چی هستش؟؟؟


تگ B در اين صورت فرزند تگ P حساب ميشه بنابراين اگر بخواهيد به آيدي دسترسي داشته باشيد بايد از رنج ها استفاده کنيد
Dim O as mshtml.IhtmltxtRange
dim Mytag as htmlElement
o=wb.document.creatrange
if o.parentelement.tagname="B" then
Line1: Mytag=o.parentElement.parentelement
mdgbox Mytag.tagname & Mytag.Id

end if

و ممکن است تا چند لايه پايين تر هم برود مثلا در بين قسمت ضحيم شده، قسمتي را رنگ کنيد ، در اين صورت تگ P والد B و تگ B والد Font خواهد بود.


یه سوال دیگه اگه بخوام روی اون قسمت از متن که bold شده ماوس علامت دست بشه باید چکار کنم؟؟؟؟


از استايل هاي CSS استفاده کنيد:
اين کد رو امتحان کنيد
<B Style="Cursor:Hand;">متن </B>

yekta64
دوشنبه 24 خرداد 1389, 12:23 عصر
تگ B در اين صورت فرزند تگ P حساب ميشه بنابراين اگر بخواهيد به آيدي دسترسي داشته باشيد بايد از رنج ها استفاده کنيد
Dim O as mshtml.IhtmltxtRange
dim Mytag as htmlElement
o=wb.document.creatrange
if o.parentelement.tagname="B" then
Line1: Mytag=o.parentElement.parentelement
mdgbox Mytag.tagname & Mytag.Id

end if


و ممکن است تا چند لايه پايين تر هم برود مثلا در بين قسمت ضحيم شده، قسمتي را رنگ کنيد ، در اين صورت تگ P والد B و تگ B والد Font خواهد بود.

از استايل هاي CSS استفاده کنيد:
اين کد رو امتحان کنيد
<B Style="Cursor:Hand;">متن </B>

مرسی دوست عزیز این کدی که شما به من دادید mshtml.IhtmltxtRangeو creatrange رو نمی شناسه ایا باید فضای نام خاصی رو تعریف کنم؟؟؟؟
و اینکه این کد رو باید کجا استفاده کنم؟؟؟/
مرسی

مشکل اینجاست که دستور cursor در html برای دست شدن hand رو نداره راه دیگه ی برای این کار وجود نداره؟؟؟؟؟

Hossis
دوشنبه 24 خرداد 1389, 19:30 عصر
مرسی دوست عزیز این کدی که شما به من دادید mshtml.IhtmltxtRangeو creatrange رو نمی شناسه ایا باید فضای نام خاصی رو تعریف کنم؟؟؟؟
و اینکه این کد رو باید کجا استفاده کنم؟؟؟/
مرسی

باید کلاس microsoft.mshtml رو رفرنس وایمپورت کنید

مشکل اینجاست که دستور cursor در html برای دست شدن hand رو نداره راه دیگه ی برای این کار وجود نداره؟؟؟؟؟
به استایل شیتها مراجعه کنید و یا از نرم افزار FrontPage یا exprationweb استفاده نمایید
اگر به نتیجه نرسیدید, در انجمن HTML/CSS مطرح نمایید.

yekta64
سه شنبه 25 خرداد 1389, 08:25 صبح
باید کلاس microsoft.mshtml رو رفرنس وایمپورت کنید

به استایل شیتها مراجعه کنید و یا از نرم افزار FrontPage یا exprationweb استفاده نمایید
اگر به نتیجه نرسیدید, در انجمن HTML/CSS مطرح نمایید.

دوست عزیز مرسی
راستش من از دات نت فریم ورک 3.5 استفاده می کنم و گویا شامل این کلاس که شما گفتید نیستش ممنون میشم راهنمایی کنید؟؟؟؟
مرسی

Hossis
سه شنبه 25 خرداد 1389, 08:39 صبح
دوست عزیز مرسی
راستش من از دات نت فریم ورک 3.5 استفاده می کنم و گویا شامل این کلاس که شما گفتید نیستش ممنون میشم راهنمایی کنید؟؟؟؟
مرسی
اين کلاس همراه ويندوز و اينترنت اکسپلورر هست و بايد از ليست کامپوننتهاي دات نت اضافه اش کنيد.

yekta64
سه شنبه 25 خرداد 1389, 10:34 صبح
اين کلاس همراه ويندوز و اينترنت اکسپلورر هست و بايد از ليست کامپوننتهاي دات نت اضافه اش کنيد.

مرسی دوست عزیز کلاس رو اضافه کردم مشکل حل شد منتها متد createrang وجود نداره فقط createelement وجود داره که با زروری این خط کد ارور می ده:


O = WebBrowser1.Document.CreateElement


ممنون میشم بگید علت چی هستش؟؟؟

Hossis
سه شنبه 25 خرداد 1389, 18:17 عصر
اين طوري تغييرش بديد
O = WebBrowser1.Document.domdocument.CreateRange
در ضمن اون که من نوشتم، Createrange بود نه CreateElement

yekta64
چهارشنبه 26 خرداد 1389, 08:19 صبح
اين طوري تغييرش بديد
O = WebBrowser1.Document.domdocument.CreateRange
در ضمن اون که من نوشتم، Createrange بود نه CreateElement

سلام
یه دنیا ممنون دوست عزیز
مشکلم حل شد منتها این کدی که شما گفتید جواب ناد
بابت راهنماییهاتون بی نهایت ممنون خیلی به من کمک کردید مرسی

yekta64
چهارشنبه 26 خرداد 1389, 11:25 صبح
سلام دوست عزيز
هر کدام از تگ هاي اچ تي ام ال مي توانند به عنوان يک شيء تلقي شده و رويدادهاي مختلف به خود بگيرند فقط کافي است يک شيء جديد از نوع HtmlElements همراه رويداد تعريف کرده و به تگ مربوطه (که کنترلهاي وب يک نوع از اين تگ ها هستند) نسبت دهيد.
مراحل کار
اول : يک شيي به نام Doc ايجاد مي کنيم که همان WB.Document است
با هر بار کامل شدن لود WB اين شيء معرفي مي شود
دوم: يک شيء‌ ديگر به نام Div اضافه کرده و با کليک بر روي Doc آن را به تگ کليک شده منتسب مي کنيم
حالا هروقت روي Div کليک شد، رويداد مورد نظر فراخواني مي شه
مثال
'' WB == Your WebBrowser


DimWithEvents Div As HtmlElement
DimWithEvents Doc As HtmlDocument

PrivateSub Wb_DocumentCompleted(ByVal sender AsObject, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEv entArgs) Handles WB.DocumentCompleted
Doc = WB.Document

end sub
PrivateSub Doc_Click(ByVal sender AsObject, ByVal e As System.Windows.Forms.HtmlElementEventArgs) Handles Doc.Click
Div = Doc.GetElementFromPoint(e.ClientMousePosition)

end sub
PrivateSub Div_Click(ByVal sender AsObject, ByVal e As System.Windows.Forms.HtmlElementEventArgs) Handles Div.Click
MsgBox("YourTag Clicked")
EndSub


باز اگر مشکلي بود در خدمتم

سلام دوست عزیز
دوست عزیز چرا وقتی رویداد کلیک رو برای div می نویسم با اولین بار کلیک رو متن نوشته شده در کنترل wbپیغام رو چاپ نمی کنه ولی با دومین با کلیک روی آن پیغام چاپ می شه ؟؟؟؟



PrivateSub Div_Click(ByVal sender AsObject, ByVal e As System.Windows.Forms.HtmlElementEventArgs) Handles Div.Click
MsgBox("YourTag Clicked")
EndSub


مرسی

Hossis
چهارشنبه 26 خرداد 1389, 13:21 عصر
سلام دوست عزیز
دوست عزیز چرا وقتی رویداد کلیک رو برای div می نویسم با اولین بار کلیک رو متن نوشته شده در کنترل wbپیغام رو چاپ نمی کنه ولی با دومین با کلیک روی آن پیغام چاپ می شه ؟؟؟؟
مرسی
چون در اولين بار کليک، تازه به برنامه معرفي مي‌شه و تا اون موقع هنوز DIV ي نيست تا کليک رو بگيره
براي اين کار ، از کليک بر روي Doc
(Doc_CLick )
يعني در همون فرماني که Div رو معرفي مي کنيد، دستور خودتون رو هم بنويسيد
مثلا
sub Doc_Click
div=o.parentElement
'' Or
Div = Doc.GetElementFromPoint(e.ClientMousePosition)
msgbox (O.parentelement.Id

yekta64
چهارشنبه 26 خرداد 1389, 14:26 عصر
چون در اولين بار کليک، تازه به برنامه معرفي مي‌شه و تا اون موقع هنوز DIV ي نيست تا کليک رو بگيره
براي اين کار ، از کليک بر روي Doc
(Doc_CLick )
يعني در همون فرماني که Div رو معرفي مي کنيد، دستور خودتون رو هم بنويسيد
مثلا
sub Doc_Click
div=o.parentElement
'' Or
Div = Doc.GetElementFromPoint(e.ClientMousePosition)
msgbox (O.parentelement.Id



بی نهایت ممنون از تمام راهنماییهاتون دوست عزیز