ستقوم هذه المقالة بإنشاء DataGrid الذي يحتوي على عنصر تحكم CheckBox يسمح عنصر التحكم هذا للمستخدمين بتحديد أعمدة متعددة للاستعراض التفصيلي. إذا لم تكن هناك طريقة لاستعادة هذه الوظيفة لـ SQL الديناميكي، فيجب استخدام عملية IN.
في نهاية المقالة، كتبنا دالة معرفة من قبل المستخدم لـ SQL Server (UDF) لتقسيم سلسلة إلى سلاسل فرعية محددة. في هذه المقالة، يمكننا أن نرى كيف يمكن أن يكون UDF مفيدًا. سنقوم بإنشاء نموذج ويب حيث يمكن للمستخدم تحديد بعض السجلات في DataGrid عن طريق تحديد عنصر تحكم خانة الاختيار. ستظهر تفاصيل هذه السجلات المحددة في DataGrid آخر في النموذج. هذا النموذج يشبه الصورة أدناه.
يظهر أدناه ASPX الذي استخدمناه لإنشاء النموذج. ملاحظة: كيفية استخدام عناصر تحكم TemplateColumn وCheckbox لزيادة أعمدة DataGrid. نستخدم أيضًا خاصية DataKeyField الخاصة بـ DataGrid لإخبار الكائن بالحقل الموجود في سجل قاعدة البيانات الذي سيحتوي على معرف المفتاح للصف الأول.
<form id="Form1"method="post" runat="server">
<asp:DataGrid معرف = "DataGrid1" تشغيل = "الخادم"
AutoGenerateColumns="False" DataKeyField="EmployeeID">
<الأعمدة>
<asp:TemplateColumn>
<قالب العنصر>
<asp:CheckBox runat = "server" ID = "EmployeeCheckBox" />
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn>
<قالب العنصر>
<%# DataBinder.Eval(Container.DataItem, "LastName") %>,
<%# DataBinder.Eval(Container.DataItem, "FirstName") %>
</ItemTemplate>
</asp:TemplateColumn>
</الأعمدة>
</asp:DataGrid>
<hr>
<asp:Button id="Orders" runat="server" Text="عرض الطلبات"></asp:Button>
<ساعة>
<asp:DataGrid ID = "DataGrid2" Runat = "الخادم" AutoGenerateColumns = "True" />
</form>
عند تحميل النموذج وتهيئته، يجب تجميع DataGrid العلوي. يستخدم التعليمة البرمجية "مكتبة المؤسسة" للوصول إلى قاعدة بيانات SQL Sever Northwind النموذجية ويقوم بتنفيذ عبارة "SELECT EmployID, FirstName, LastName FROM Staffers". رمز حدث التحميل كما يلي:
Private void Page_Load(object sender, System.EventArgs e)
{
إذا (!Page.IsPostBack)
{
Database db = DatabaseFactory.CreateDatabase();
DBCommandWrapper dbCommandWrapper
باستخدام(dbCommandWrapper = db.GetSqlStringCommandWrapper(SELECT_EMPLOYEES))
{
باستخدام (IDataReader dataReader = db.ExecuteReader(dbCommandWrapper))
{
DataGrid1.DataSource = dataReader;
DataGrid1.DataBind();
}
}
}
}
عندما ينقر المستخدم على زر "الطلبات"، نريد عرض جدول بيانات ثانٍ يطابق تلك الموجودة في قاعدة البيانات مع الموظفين ويرتبط ببيانات الطلبات. إحدى الطرق للقيام بذلك هي إنشاء SQL ديناميكي واستخدام الشرط OR لكافة معرفات الموظفين المطلوبة لعبارة WHERE.
الطريقة الثانية هي استخدام عملية IN لعبارة WHERE. تقوم عملية IN بمقارنة قائمة من التعبيرات. على سبيل المثال، تقوم العبارة التالية بإرجاع المعلومات بين معرف الموظف 7 و4.
حدد معرف الموظف والاسم الأول واسم العائلة من الموظفين حيث معرف الموظف في (7، 4)
من الناحية النظرية، أرغب في استخدام معلمة سلسلة واحدة للاستعلام عن المعرفات التي تم تمريرها، ومع ذلك، ربما كسلسلة واحدة، لا يمكن استخدامها لعملية IN A معلمة سلسلة واحدة. في هذه الحالة، ستكون عبارة SQL "WHERE الموظف IN ('7, 4')" وستقوم قاعدة البيانات بإرجاع رسالة خطأ لأن معرف الموظف من النوع int - وليس varchar.
ومع ذلك، فإننا نستخدم دالة التقسيم الموضحة في المقالة لفصل السلسلة إلى قيم مختلفة. قم بتمرير السلسلة '7، 4' إلى دالة التقسيم وسنحصل على سجلين يتوافقان مع القيمتين 4 و7. سيكون استعلام SQL لتحديد الموظفين وحساب إجماليات طلباتهم كما يلي:
SELECT count(*) AS Orders, E.FirstName, E.LastName
FROM Orders O
INNER JOIN الموظفين E ON O.EmployeeID = E.EmployeeID
حيث E.EmployeeID IN(SELECT Value FROM fn_Split(@employeeIDs, ','))
GROUP BY FirstName, LastName
ORDER BY count(*) DESC
ما هو مطلوب لاستخدام الاستعلام أعلاه هو أنه يجب إنشاء المعلمة @employeeIDs وتمريرها. ستكون هذه المعلمة عبارة عن قائمة معرفات مفصولة بفواصل. لإنشاء هذه السلسلة، لمعرفة ما إذا كان الصف قد تم تحديده من قبل المستخدم، نحتاج إلى استخدام حلقة تتكرر عبر عدد الصفوف وتتحقق من كل عنصر تحكم في خانة الاختيار. إذا قام المستخدم بتحديد صف، فسيتم حفظ المفتاح في الموظف عن طريق استخراج الفاحص من خاصية DataKeys الخاصة بالجدول (والتي تم إنشاؤها في ملف ASPX للإشارة إلى حقل معرف الموظف).
سلسلة خاصة GetCheckedEmployeeIDs ()
{
محدد السلسلة = String.Empty؛
StringBuilder memberIDs = new StringBuilder();
for(int i = 0; i < DataGrid1.Items.Count; i++)
{
خانة الاختيار؛
checkbox = DataGrid1.Items[i].FindControl("EmployeeCheckBox") as CheckBox;
إذا (مربع الاختيار ! = فارغ && مربع الاختيار. تم التحقق == صحيح)
{
StaffIDs.Append(delimiter + DataGrid1.DataKeys[i].ToString());
المحدد = ""،"؛
}
}
إرجاع معرفات الموظفين.ToString();
}
تُرجع الطريقة المذكورة أعلاه سلسلة نصية، مثل "10، 7، 20". سيتضمن معالج حدث النقر فوق زر الطلبات طريقة تقوم بتمرير المعلومات إلى SQL للحصول على قائمة بالموظفين والأوامر، وربط النتائج في كائن DataGrid ثانٍ.
Orders_Click باطلة خاصة (مرسل الكائن، System.EventArgs e)
{
معرفات سلسلة الموظفين = GetCheckedEmployeeIDs();
Database db = DatabaseFactory.CreateDatabase();
DBCommandWrapper dbCommandWrapper
باستخدام(dbCommandWrapper = db.GetSqlStringCommandWrapper(SELECT_ORDERS))
{
dbCommandWrapper.AddInParameter("@employeeIDs", DbType.String, memberIDs);
باستخدام (IDataReader dataReader = db.ExecuteReader(dbCommandWrapper))
{
DataGrid2.DataSource = dataReader;
DataGrid2.DataBind();
}
}
}