2

再びシナリオに突入。要約は次のとおりです。基本的にテキストボックス、イメージボタン、チェックボックスリストを組み合わせて、チェックボックス付きの単一選択ドロップダウンのように見えるユーザーコントロールがあります..かなりうまくいきます。ユーザーコントロール内の画像の1つは、aspxページをポップアップとして開きます。値をデータベースやスタッフに保存する機能はほとんどありません。ポップアップ ページの [OK] ボタンをクリックすると、値を DB に保存し、DB に保存した値を (ドロップダウンとして機能する) ユーザー コントロールに入力できるはずです。ここで問題が発生します.checkboxlist(ユーザーコントロールに存在する)をDBの値にバインドしようとすると、checkboxlistオブジェクトがnullであり、作成されていないというエラーが発生します. OKボタンをクリックすると、

PFB 関連コード: Usercontrol.ascx:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="SingleSelectCustomDropDown.ascx.cs" Inherits="MS.IT.Informa.UI.UserControls.SingleSelectCustomDropDown" %>

<asp:Panel ID="panel" runat="server">
<div id="FirstDiv">
<table>
<tr>
<td align="right">
<asp:TextBox ID="txtSelect" runat="server" ReadOnly="true"></asp:TextBox>
</td>
<td>
<asp:Image ID="imgShow" ImageUrl="../Images/DDGlyph.png" onmouseover="this.src='../Images/DDGlyphHOVER.png'" onmouseout="this.src='../Images/DDGlyph.png'" runat="server" />
</td>
</tr>
<tr>
<td colspan="2">
<div id="SecondDiv" style="display:none;">
<asp:CheckBoxList ID="chkBoxList" runat="server">
<asp:ListItem Value="0" Text="Standard" Selected="True"></asp:ListItem>
</asp:CheckBoxList>
</div>
<div id="ThirdDiv" style="display:none;">
<asp:ImageButton ID="btnNew" runat="server" Height="20px" ImageUrl="~/Images/new.png" Width="20px" OnClientClick="ShowPopup();" />
<asp:ImageButton ID="btnEdit" runat="server" Height="20px" ImageUrl="~/Images/edit.png" Width="20px" />
<asp:ImageButton ID="btnDefault" runat="server" Height="20px" ImageUrl="~/Images/default.png" Width="20px" />
<asp:ImageButton ID="btnDelete" runat="server" Height="20px" ImageUrl="~/Images/delete.png" Width="20px" />
</div>
</td>
</tr>
</table>
</div>
</asp:Panel>
<script type="text/javascript">
//Displays the divs containing checkboxlist and images
function ShowList() {
    document.getElementById("SecondDiv").style.display = "block";
    document.getElementById("ThirdDiv").style.display = "block";
}
//Hides the divs containing checkboxlist and images
function HideList() {
    document.getElementById("SecondDiv").style.display = "none";
    document.getElementById("ThirdDiv").style.display = "none";
}
//Displays the selected item from the checkboxlist into the textbox placed in the Custom Control
function DisplaySelectedItem(sender, txtBoxID) {

    var x = document.getElementById(sender.id);
    var chkBoxPrefix = sender.id + "_";
    var selectedText;
    for (i = 0; i < x.rows.length; i++) {
    if(document.getElementById(chkBoxPrefix+i).checked)
    {
        selectedText = document.getElementById(chkBoxPrefix+i).parentNode.innerText;
    }
    }
    document.getElementById(txtBoxID.id).value = selectedText;
}
//Ensures that only one item is selected from the checkboxlist
function SelectOnlyOneCheckBox(e) {

    if (!e) e = window.event;
    var sender = e.target || e.srcElement;
    if (sender.nodeName != 'INPUT') {
        return;
    }
    var checker = sender;
    var chkBox = document.getElementById('<%= chkBoxList.ClientID %>');
    var chks = chkBox.getElementsByTagName('INPUT');
    for (i = 0; i < chks.length; i++) {
        if (chks[i] != checker)
            chks[i].checked = false;
    }
}
function ShowPopup() {
    window.open("ViewColumnOptions.aspx", "ViewColumnOptions", "height=300,width=600,left=300,top=150");
}
</script>

以下のようなユーザーコントロールのコードビハインド:

public partial class SingleSelectCustomDropDown : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
    {
            if (!IsPostBack)
        {

           chkBoxList.Attributes.Add("onclick", "SelectOnlyOneCheckBox(event);DisplaySelectedItem(this," + txtSelect.ClientID + ");HideList();");
            txtSelect.Attributes.Add("onclick", "ShowList();");
            imgShow.Attributes.Add("onclick", "ShowList();");
        }
    }
    public void PopulateOtherViews()
    {
        SaveReportViewFilter<ReportFilterBase> newObj = new SaveReportViewFilter<ReportFilterBase>();
        ViewColumnOptions vwobj = new ViewColumnOptions();
        newObj.UserName = vwobj.Page.User.Identity.Name;
        SaveReportView<ReportFilterBase> obj2 = new SaveReportView<ReportFilterBase>();
        DataTable dt = obj2.GetSaveReportViewFromDataBase(newObj);
        chkBoxList.DataSource = dt;//chkBoxList becomes null here..we have ample data in the datatable though
        chkBoxList.DataTextField = dt.Columns[0].ToString();
        chkBoxList.DataValueField = dt.Columns[0].ToString();
        chkBoxList.DataBind();
    }
}

関数 PopulateOtherViews は、aspx ページのボタン クリックで呼び出されます。以下はコードです:

    protected void btnOK_Click(object sender, EventArgs e)
    {
        if (chkSaveView.Checked)
        {
            if (!string.IsNullOrEmpty(txtViewName.Text))
            {
                //some code here to save the view name from txtViewName to the DB
                SingleSelectCustomDropDown obj22 = new SingleSelectCustomDropDown();
                obj22.PopulateOtherViews();
                Page.ClientScript.RegisterStartupScript(this.GetType(),"close","CloseWindow();",true);

         }
            else
            {
                Page.ClientScript.RegisterStartupScript(this.GetType(), "alertEnterViewName", "alertMessage('Please enter the view name');", true);
            }

        }

    }

ヘルプ、提案、ポインタは大歓迎です。よろしくアヌラグ

4

1 に答える 1

0

btnOK_Click では、ユーザー コントロールの新しいインスタンスを作成していて、それをページにアタッチしていません。私の提案は次のとおりです。

1.ユーザーコントロールを登録し、ページに追加します。

<%@ Register Src="~/UserControl/SingleSelectCustomDropDown.ascx" TagPrefix="uc1" TagName="SingleSelectCustomDropDown" %>

と ...

<uc1:SingleSelectCustomDropDown runat="server" id="obj22" /> 

2.コードビハインドで次のように変更します。

protected void btnOK_Click(object sender, EventArgs e)
{    
    if (chkSaveView.Checked)
    {
        if (!string.IsNullOrEmpty(txtViewName.Text))
        {
            //some code here to save the view name from txtViewName to the DB
            //Do not create the control again
            //SingleSelectCustomDropDown obj22 = new SingleSelectCustomDropDown();
            obj22.PopulateOtherViews();
            Page.ClientScript.RegisterStartupScript(this.GetType(), "close", "CloseWindow();", true);

        }
        else
        {
            Page.ClientScript.RegisterStartupScript(this.GetType(), "alertEnterViewName", "alertMessage('Please enter the view name');", true);
        }

    }
}
于 2013-07-25T00:48:04.953 に答える